retain/releaseを介してメモリを管理するための "ルール"を理解したことによると、オブジェクトを割り当て/コピー/保持する場合は常に解放する必要があります(目的C:インラインで割り当てられたオブジェクトの保持/解放
)。私が代わりにFOOをインラインで作成する場合id foo = [[MyClass alloc] init];
id bar = [[MyClass alloc] init];
[bar takeOwnership:foo]; //bar retains foo
[foo release]; //I'm done with it now, so I release it
は、私はこのように、何をしますか:
id bar = [[MyClass alloc] init];
[bar takeOwnership:[[MyClass alloc] init]];
私は明らかに私はそれを割り当てる際に、以前のfooとして知られているオブジェクトを解放し、参照することなくすることはできません私は後でそれを解放することはできません。事実、「あなたが所有していればそれを解放しなければならない」というアプローチは、オブジェクトが行を漏らしてしまわないようにするためにインラインでオブジェクトを割り当てることができないということを暗示しているようです。
So:本当に何かをインラインに割り当てることは本当に困惑していますか?上記の例は少し工夫されていますが、明白な解決策はありませんが、そうすることが意味的に望ましいと思われる状況があるようです(実際には、状況)。そのような場合、つまり、上記のようにオブジェクトをインラインで割り当てることができると仮定すると、オブジェクトがインラインで割り当てられていない「通常の」ケースを完全に破ることなく、そうする方法がありますか?
私は彼らが役に立つと思っていることについて詳細を述べることができますが、うまくいけば上のことが私の質問を横取りします。
簡単な答えはしません - 別の割り当てを行います。または、autoreleaseを使用してください。 Objective-Cでは 'id temp;のようなことをすることができます。 [bar takeOwnership:temp = [[MyClass alloc] init]]; [temp release]; '、それが気分を良くするなら、関数やパフォーマンスにおいて、one-linerといくつかのステートメントを実行することには本当の利点はありません。 –
しかし、何らかの目立たない理由のために、1ライナーを実行しなければならないと感じたら、 'takeOwnership'はあなた自身のメソッドです。引数とコードを返します。[[bar takeOwnership:[[MyClass alloc] init] ]リリース]; '。 –