2011-10-26 8 views
0

サンプルコードを使用する必要があります:リリースには、オブジェクトを返したり、私はautoreleaseの

- (Foo*)createFoo { 
    Foo *foo = [[Foo alloc] init]; 
    return foo; 
} 

- (void)someOtherMethod { 
    Foo *foo; 
    foo = [self createFoo]; //retain count 1 
    [foo release]; //retain count = 0 => object gets released? 

    //repeat 
    foo = [self createFoo]; 
    [foo release]; 
} 

Qeustion(多分愚かなものを):私はcreateFooに自動解放しなければならないのか、私はsomeOtherMethodで返されたオブジェクトを解放することができますか?

+0

あなたは[self Foo]ではなく[self createFoo]を呼び出しているとします。そうすれば、someOtherMethodでそれを解放することもできます。ちょっと心に留めておいてください。ほとんどすべての問題を取り除くことができます。 –

+1

@ilMalvagioDottorProsciutto私はARCコメントに同意しますが、ARCだけでこれらの呼び出しを行うだけでなく、手動で行うべき方法の知識があるといいと思いますとにかく、それが何をしているかを知ることはとてもいいです。 –

+0

@SimonLeeまさに私の考え – peko

答えて

0

このインスタンスのコードは、所有者を呼び出しコードに引き渡すときにオブジェクトを自動リリースする必要があります。メソッド内で責任を負うことはもうしません。

NARCを覚えている - これらのキーワードで始まるメソッドは自動解放しないことを前提としている...

を新、のAlloc、保持、コピー

あなたの方法をnewFooまたはcopyFooと命名した場合は、上記のコードは次のようになりますオートリリースせずに罰金。

+0

だから、何も間違っていて、リンゴのコード要件に従って、newFooにcreateFooをリネームするとどうなりますか? – peko

+0

はい、それはうまくいけません。そうでなければautoreleaseを呼び出して、それを呼び出しコードに残し、完了したら解放してください。 –

0

ココアのメモリ管理は、誰もが一連のルールに従うので、実際には非常に簡単です。あなたはそれらのルールに従っていないので、問題に遭遇します。

Basic Memory Management Rulesを読んでください。あなたがそれらの規則に従うことに固執すれば、あなたは大丈夫でしょう。

関連する問題