の違いは何ですか。何が一番いいですか?同じリリースをドレインしますが、ドレインが異なると保持を保存しませんが、リリースは保持を保存しますか? しばらくの間、オブジェクトをメモリに自動解放します。
3 に答える
何が一番いいですか?もちろん、答えは「状況によって異なります」です。
ココアのほとんどの初心者にとって、私の意見は「上記のどれでもない」です-それはARCです。ARCを使用する場合でも、参照カウントされたメモリ管理についてある程度理解することは重要ですが、過剰にリリースすることで、release
またはを見逃すことを心配する必要はありません。autorelease
上記の@AnshukGargで説明されているように、スレッドの自動解放プールが空になる前に多数の一時オブジェクトを作成している場合は、問題のコードを@autorelease { ... }
ブロックでラップできます。Instrumentsは、これらの設定でメモリフットプリントが問題であるかどうかを判断できます。
同じリリースをドレインしますが、ドレインが異なる場合は保持を保存しませんが、リリース保存保持は、オブジェクトをメモリに自動解放します。
リリース:参照カウント環境では、自動リリースプールを保持できないため、このメソッドは保持カウントを減らします。自動解放プールの割り当てが解除されると、自動解放されたすべてのオブジェクトに「解放」メッセージが送信されます。また、ガベージコレクション環境では、この方法はノーノーです。
- (void)release
ドレイン:参照カウント環境で、レシーバーを解放してポップします。ガベージコレクション環境では、最後のコレクション以降に割り当てられたメモリが現在のしきい値よりも大きい場合にガベージコレクションをトリガーします。
- (void)drain
結論:上記の簡単な説明から、自動リリースプール(CocoaまたはCocoa touch)には常に「リリース」ではなく「ドレイン」を使用する必要があることは明らかです。
リリースと自動リリース ほとんどの場合、どちらの方法でも問題はありません。-autoreleaseは、実行ループの現在の反復の最後にオブジェクトが解放されることを意味するだけなので、オブジェクトはどちらの方法でも解放されます。
-autoreleaseを使用する最大の利点は、メソッドのコンテキストでオブジェクトの存続期間について心配する必要がないことです。したがって、オブジェクトが最後に使用されてから数行後にオブジェクトで何かを実行したい場合は、-releaseへの呼び出しを移動することを心配する必要はありません。
-releaseを使用する場合の主な例は、-autoreleaseを使用する場合と比べて顕著な違いがあります。これは、メソッドで多数の一時オブジェクトを作成する場合です。