2

Google Objective-C Style Guideによると、自動解放してから次のように保持する必要があります。

- (void)setFoo:(GMFoo *)aFoo {
  [foo_ autorelease];  // Won't dealloc if |foo_| == |aFoo|
  foo_ = [aFoo retain];
}

この場合、foo_ は同じインスタンスに設定されていても解放されず、より防御的なセッターになります。

私の質問は、これが @property と @synthesize の仕組みですか?

4

1 に答える 1

4

自動解放による解放は現在の実行ループの終わりまで呼び出されないため、保持が最初に呼び出され、次に現在の実行ループの終わりに解放が呼び出されるため、foo_はdeallocを実行しません。ただし、これは@synthesizeで生成されたコードが機能する方法ではありません。それはより

- (void)setFoo:(GMFoo *)aFoo {
   if (aFoo != foo_) {
      [aFoo retain];
      [foo_ release];
      foo_ = aFoo;
   } 
}

この方法は、変更が不要な場合のCPUサイクルを節約し、自動解放プールを使用する際のわずかなオーバーヘッドを取り除きます。

于 2011-01-22T14:10:46.817 に答える