2011-12-31 10 views
0

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:本当に何かをインラインに割り当てることは本当に困惑していますか?上記の例は少し工夫されていますが、明白な解決策はありませんが、そうすることが意味的に望ましいと思われる状況があるようです(実際には、状況)。そのような場合、つまり、上記のようにオブジェクトをインラインで割り当てることができると仮定すると、オブジェクトがインラインで割り当てられていない「通常の」ケースを完全に破ることなく、そうする方法がありますか?

私は彼らが役に立つと思っていることについて詳細を述べることができますが、うまくいけば上のことが私の質問を横取りします。

+0

簡単な答えはしません - 別の割り当てを行います。または、autoreleaseを使用してください。 Objective-Cでは 'id temp;のようなことをすることができます。 [bar takeOwnership:temp = [[MyClass alloc] init]]; [temp release]; '、それが気分を良くするなら、関数やパフォーマンスにおいて、one-linerといくつかのステートメントを実行することには本当の利点はありません。 –

+0

しかし、何らかの目立たない理由のために、1ライナーを実行しなければならないと感じたら、 'takeOwnership'はあなた自身のメソッドです。引数とコードを返します。[[bar takeOwnership:[[MyClass alloc] init] ]リリース]; '。 –

答えて

6
[bar takeOwnership:[[MyClass alloc] init]]; 

ARCを使用している場合は、何もしないでください。それは「うまくいく」。

あなたはその後、手動-保持リリース(MRR)を使用している場合:自動解放圧力がパフォーマンスの問題になる可能性があること

[bar takeOwnership:[[[MyClass alloc] init] autorelease]]; 

注意を。つまり、その理由でインラインケースの自動解放を避けたい場合があります。しかし、このコードのパスを通過する前に、プールが排水される前の100秒間または1000秒間は、それを心配しないでください。

+0

ARCと自動解放プールを使用していない場合はどうなりますか?具体的には、私は組み込み環境(iPhone/iPadではなく)でObjective Cを使用しています。そのような環境で自動解放プールのようなもののオーバーヘッドはいくらか高価になり、ARCは単に問題にはなりません。この場合、このアプローチを完全に避けるだけでいいですか? – user1124700

+0

なぜARCを使用できないのですか?これはコンパイル時の機能です。実行時のオーバーヘッドは発生しません。 – user57368

+0

良い点 - 私はObjC2ガベージコレクションと混同していました。私はARCを稼働させることを見ていきます - ありがとう! – user1124700

関連する問題