2012-01-31 7 views
1

私は2つのプロパティを持つ新しいのUIViewControllerを作成しています:iOS - NSURLがinitメソッドに保持されないのはなぜですか?

@property (retain, nonatomic) NSURL *url; 
@property (retain, nonatomic) NSString *title; 

とsynthetised:私はメモリ管理ガイドが言うようにセッターを使用したが、いないよ、私のカスタムのinitメソッドで

@synthesize url = _url; 
@synthesize title = _title; 

私はのviewDidLoadでプロパティを使用する必要があり、URLは空のようで、タイトルはありません

- (id)initWithURL:(NSURL *)url andTitle:(NSString *)titleTemp 
{ 
    self = [super initWithNibName:@"navigatorViewController" bundle:nil]; 
    if (self) { 
     _url = url; 
     _title = titleTemp; 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 
    [_titreBarButtonItem setTitle:_title]; 

    NSURLRequest *urlRequest = [[NSURLRequest alloc] initWithURL:_url]; 
    [_webView loadRequest:urlRequest]; 
    [urlRequest release]; 
} 

私は私のタイトルを見ることができませんが、私のWebビューは空白です。 initでself.urlを使用している場合、動作しています!

アイデアはありますか?

PS:ここで私は私のinitを呼び出す方法は次のとおりです。あなたがcopyまたはretainを使用して(あなたがを保持何のため)の参照を追加する必要が

NSString *urlString = [[[NSBundle mainBundle] pathForResource:@"infos" ofType:@"html"] copy]; 
NSURL *url = [[NSURL alloc] initFileURLWithPath:urlString]; 
[urlString release]; 
navigatorViewController *navigatorVC = [[navigatorViewController alloc] initWithURL:url andTitle:@"Infos"]; 
[url release]; 
[self presentViewController:navigatorVC animated:YES completion:nil]; 
[navigatorVC release]; 

どうもありがとう

+0

あなたが読んで、 '@のsynthesize'を使用している場合は、[この](http://stackoverflow.com/questions/8576593/objective-c-memory-management-of-instance-members/8576760#8576760)背景に何が起こっているのかを概観することができます。また、 'retain'、' release'などの目的で、メモリ管理を理解していることを確認してください。 –

答えて

1

あなたはいずれかを使用してURLを保持しなければならない:initメソッドで

self.url = url; 

するか、このようなinitメソッドでURLを割り当てた後、保持して呼び出します。

_url = url; 
[_url retain]; 
+0

そして、あなたがdeallocのself.urlでリリースを呼び出すことを忘れないでください。 –

1

_url = [url copy]; 
_title = [titleTemp copy]; 

または

_url = [url retain]; 
_title = [titleTemp retain]; 
+0

なぜ、_titleがそれなしで動作するのですか? – Dabrut

+0

@Daveのタイトルは 'NSString'リテラルです - それは不変です – justin

4

プロパティをretainとして設定していますが、合成ゲッターを使用する場合にのみ適用されます。 IVARに値を直接設定することで、あなたはこれをバイパスされ、値が

を保持されていない、あなたは(あなたがすでにセッターを持って、おそらくない素晴らしい方法を)やるべきこと:

_url = [url retain]; 

またはより良いです:

self.url = url; 

またはより良いマットはコメントで言ったように:カスタムinitメソッドを書く場合は、トンを行う必要があるまあARC

+0

これに加えて、これは、' _url = url'を実行するときにARCがあなたのために保持を追加するので、これが働く喜びです。したがって、必要に応じてセッターをバイパスして、適切なメモリ管理の利点を得ることもできます。 – mattjgalloway

+1

良い点@mattjgallowayなので、ここの答えは本当にあります:あなた自身を保持するか、セッターを使うかARCを使用してください – wattson12

1

を使用彼はあなたの自己を保持:それはタイトルで働い

- (id)initWithURL:(NSURL *)url andTitle:(NSString *)titleTemp 
{ 
    self = [super initWithNibName:@"navigatorViewController" bundle:nil]; 
    if (self) { 
     _url = [url retain]; 
     _title = [titleTemp retain]; 
    } 
    return self; 
} 

は、変数が、おそらく後でその後、initメソッドでNSURLパスをリリースしているだけのことです。

関連する問題