:
-(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を再読み込みすることは常に価値がある:私はそれを修正したい方法は、このようなものです。
プロパティを初期化する別の方法は、 'searchResults = [[NSMutableArray alloc] init];'を実行することです。つまり、代わりにプロパティに代入するのではなく、ivarに代入します。 –
これは本当ですが、それは危険な習慣ですが、IMO。そのような割り当てを行うときにsearchResultsが既存のオブジェクトを指していると、そのオブジェクトはリークします。私はすべての私のインスタンス変数の割り当てに一貫してドットプロパティを使用する方が好きです。それは私の弱い脳に考えさせることを少なくします。 – cduhn
私はイニシャライザ( 'init'または' initXYZ: 'メソッド)でのみこれを行います。私はそれが一度だけ呼び出されると仮定します。 –