2011-01-22 18 views
2

ための保持、我々は次にように保持する自動解放すべきである:自動解放次いで<a href="http://google-styleguide.googlecode.com/svn/trunk/objcguide.xml?showone=Autorelease_Then_Retain#Autorelease_Then_Retain" rel="nofollow">Google Objective-C Style Guide</a>によればセッター

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

この場合、foo_より防御のために作る、同じインスタンスに設定されている場合割り当て解除されることはありませんセッター。

私の質問は、どのような@property & @合成作業ですか?

答えて

4

リリースは現在のrunloopの最後まで呼び出されません。したがって、foo_はdeallocを使用しません。これは、現在のrunloopの最後にretainが最初に呼び出されるためです。しかし、これは@synthesizeで生成されたコードがどのように動作するかではありません。これは、変更が必要ではなく、自動解放プールを使用しての小さなオーバーヘッドを取り出すときに、この方法は、CPUサイクルを節約し、より

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

のように動作します。

+0

これが当てはまる場合、Googleの推奨はあまり最適ではありませんか? – Jaryl

+0

はい。より魅力的に見えますが、最適ではありません。 – mackross

+1

[foo_ autorelease]を使用しないと、オブジェクトが非構造で、別のスレッドからアクセスされている場合、競合条件が発生する可能性があります。 [foo_ autorelease]を使うことで、私たちは通常、安心して小さなパフォーマンスヒットを支払うだけです!したがって、Googleの推奨。 – pchap10k

関連する問題

 関連する問題