2011-07-29 20 views
3

私はインスタンス変数NSMutableArray * searchResultsを持っています。iPhone:インスタンス変数の再割り当て=割り当て解除ですか?

まず、私はそれを初期化します。

self.searchResults = [[NSMutableArray alloc] init]; 

その後、私のアプリのコースで、それは頻繁に再割り当てされます:

NSMutableArray* results = [searcher getResults]; 
self.searchResults = results; 

私の質問は、アレイので、これはメモリリークが発生しますですこれは、以前にこの再割り当て中に割り当て解除されないことを指摘しましたか?

NSMutableArray* results = [searcher getResults]; 
self.searchResults = nil; 
self.searchResults = results; 

もちろん、私はそれをdeallocで解放し、それをviewDidUnloadでnilに設定します。

答えて

1

-(void)setSearchResults:(NSMutableArray *)array{ 
    if(searchResults!=array){ 
     [searchResults autorelease]; 
     searchResults = [array retain]; 
    } 
} 

ので、あなたが心配することなく、これを行うことができます。 self.searchResultsはこのような機能のものを呼び出します。あなたは考える。答えは、プロパティが宣言された方法、およびオブジェクトを割り当てた後にオブジェクトを解放するかどうかによって異なります。

(異なるオブジェクトによって所有され、デリゲート、のようなものではなく)あなたのオブジェクトが所有するプロパティを宣言するときは、通常はこのようにそれを宣言します。

@property (nonatomic, retain) NSMutableArray *searchResults; 

私はこれがあると仮定していますあなたの財産がどのように宣言されているか。その宣言のretain句は、オブジェクトがこのプロパティのセッターメソッド(つまりself.searchResults = fooまたは[self setSearchResults:foo];のいずれか)によって割り当てられると自動的に保持されることを意味します。

プロパティがすでに既存のオブジェクトを参照している場合は、retain句を使用すると、プロパティが再割り当てされると既存のオブジェクトが自動的に解放されます。したがって、別の割り当てを行う前にself.searchResults = nil;を設定すると、既存のオブジェクトが解放されますが、実際には不要です。self.searchResults = results;は既存のオブジェクトを解放してから新しい参照を保持して保存するためです。あなたの保持カウントは2で、この行の後に

self.searchResults = [[NSMutableArray alloc] init]; 

あなたはこのライン上のメモリリークを有することができます。 allocには+1、プロパティ割り当てには+1があります。これにより、メソッドの他の場所に[self.searchResults release]がない限り、メモリリークが発生します。

self.searchResults = [[[NSMutableArray alloc] init] autorelease]; 

あなたはメモリ管理について混乱しているときはいつでも、それが戻ってMemory Management Programming Guideを再読み込みすることは常に価値がある:私はそれを修正したい方法は、このようなものです。

+0

プロパティを初期化する別の方法は、 'searchResults = [[NSMutableArray alloc] init];'を実行することです。つまり、代わりにプロパティに代入するのではなく、ivarに代入します。 –

+1

これは本当ですが、それは危険な習慣ですが、IMO。そのような割り当てを行うときにsearchResultsが既存のオブジェクトを指していると、そのオブジェクトはリークします。私はすべての私のインスタンス変数の割り当てに一貫してドットプロパティを使用する方が好きです。それは私の弱い脳に考えさせることを少なくします。 – cduhn

+0

私はイニシャライザ( 'init'または' initXYZ: 'メソッド)でのみこれを行います。私はそれが一度だけ呼び出されると仮定します。 –

2

@propertyretainまたはcopyと宣言され、@synthesizeで作成された場合、メモリリークは発生しません。そうでない場合は、メソッドの実装に応じて1つを持つことができます。

+0

今、私は混乱しています。だから、サプリシットが言ったことは正しいのではないのですか?私は保持して合成する –

+0

プロパティがretainと宣言されている場合、コンパイラは以前の値を解放し、新しい値を保持するセッターを生成します。 getResultsメソッドがオートレリースされた配列を返すと仮定すると、メモリ管理の問題はありません。 –

+0

FWIW、他の回答が検索されたようです。 –

0

プロパティをretainとして宣言している場合は、self.searchResultsに対して、自動解放されたインスタンスを割り当てる必要があります。すなわち ヘッダファイル:

@property(nonatomic,retain)NSMutableArray *searchResults; 

実装ファイル:あなたは合成に保持してプロパティを持っている場合

@synthesize searchResults; 
self.searchResults=[[[NSMutableArray alloc] init] autorelease]; 

は、それはあなたのためのセッターとゲッターを作成します。さて、あなたがメモリリークを持っていますが、いない理由のためにも

self.searchResults=[searcher getResults]; 
関連する問題