2009-04-26 7 views
1

アップルインスタンス変数mainSprocketためsetterメソッドでこれをやっている:-releaseではなく、セッターメソッドでmyautoreleaseをインスタンス変数に送信する必要がありますか?

– (void)setMainSprocket:(Sprocket *)newSprocket { 
    [mainSprocket autorelease]; 
    mainSprocket = [newSprocket retain]; 
    return; 
} 

は、なぜ彼らは-release -autorelease送信しませんか?ここでは悪い影響がありますか?インスタンス変数mainSprocketによって保持されている現在のオブジェクトは、もはやそのインスタンス変数によって使用されなくなったということだけが分かります。他の誰かがまだそのオブジェクトに正確に興味を持っている場合、そのメソッドはそれを保持することができますか?だから落ち着くべきだと思いますか?

答えて

3

autoreleaseここにある場合は、newSprocketmainSprocketが同じオブジェクトになる場合があります。 releaseへの呼び出しにより、オブジェクトが次の行に保持される前に誤ってオブジェクトの割り当てが解除される可能性があります。autoreleaseは、イベントループの最後に自動解放プールが排水されるまで処理されません。 mainSprocketが自動解放されなかった場合は、最後の行は、問題を引き起こす

Sprocket *mySprocket = [Sprocket spacelySprocket]; 
[sprocketManager setMainSprocket:mySprocket]; 

Sprocket *anotherPointerToMySprocket = mySprocket; 
[sprocketManager setMainSprocket:anotherPointerToMySprocket]; 

は、このシナリオを考えてみましょう。あなたは時々同じことを行いセッターコードを見るかもしれないもう一つの規則は次のとおりです。

– (void)setMainSprocket:(Sprocket *)newSprocket { 
    if (newSprocket != mainSprocket) { 
     [mainSprocket release]; 
     mainSprocket = [newSprocket retain]; 
    } 
} 

私は、どのコメントを他の人にそれを任せるmainSprocket場合

+0

感謝。しかし、それが同じオブジェクトではない場合、私は何度もそのメソッドを呼び出す、私はautoreleaseプールの問題に遭遇しないだろうか?プールはアプリケーションの主な機能でのみ排水されることがありますか? – Thanks

+0

多くのオブジェクトが作成されている機能を使用している場合は、自動解放プールを排水できます。 –

+0

ビルドしているプログラムフローが関数を何度も呼び出す場合は、引用している簡単な例のように、Appleの他の戦略を採用することができます。特別な自動解放プールを設定して自分で排水するか(gsが示唆するように手動で主自動解放プールを排水する)、自動解放を使用しないでください。あなたが取るアプローチは、あなたのニーズに完全に依存します。 –

4

:-)より適切か、美的ですnewSprocketは同じオブジェクトで、単純なreleaseを使用すると解放される可能性があります。

– (void)setMainSprocket:(Sprocket *)newSprocket { 
    // if newSprocket and mainSprocket were the same object, 
    // it would first be retained and then released 
    // and therefore not deleted. 
    [newSprocket retain]; 
    [mainSprocket release]; 
    mainSprocket = newSprocket; 
    // you don't need return in a void-method 
    // return; 
} 

なぜあなたが使用していないプロパティ:あなたはautoreleaseを使用しない場合

、これを使用しますか?これはObjective-C 2.0のやり方です。

SomeObject.h

@interface SomeObject : NSObject { 
    Sprocket *mainSprocket; 
} 

@property(retain) Sprocket *mainSprocket; 

@end 

SomeObject.m

@implementation SomeObject 

@synthesize mainSprocket; 

@end 
+0

ありがとうございます。私はプロパティを使用しますが、何が起きているのかをシーンの後ろに取りたいです:) – Thanks

関連する問題