16

一部のオブジェクトが知らないうちに自動リリースされることに少しイライラしています。良いことかもしれませんが、もしそうなら知りたいです。ドキュメントには、どのメソッドがオブジェクトを自動解放するかが記載されていないので、私は通常、自分の道をテストしますが、これは私の意見ではばかげています。たとえば、[NSDate date]はオブジェクトを自動解放し、[NSArray arrayWithObjects:...]も自動解放します。ドキュメントに書かれていないのにどうやってわかりますか?

静的関数を使用してオブジェクトを作成するこのようなメソッドは、常に自動解放されたオブジェクトを返すというパターンが見られ始めています。これは常に本当ですか?

4

2 に答える 2

20

基本的に、initcopy、またはretainオブジェクトの場合は、それをリリースする責任があります。そうでない場合は、それをリリースする責任はありません。

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

多くのクラスは、クラスの新しいインスタンスを取得するために使用できる +className... 形式のメソッドを提供します。「便利なコンストラクター」と呼ばれることが多いこれらのメソッドは、クラスの新しいインスタンスを作成し、初期化して、ユーザーが使用できるように返します。この方法で作成されたオブジェクトを解放する責任があると思われるかもしれませんが、前述の所有権ポリシーによれば、そうではありません。クラスは新しいオブジェクトを作成するため、新しいオブジェクトを破棄する責任があります。

于 2009-09-23T15:32:11.603 に答える
4

メソッドのシグネチャ自体が教えてくれます。「classNameWithData:data1:data2」のような署名を持つメソッドのパターンは、そのものの alloc/init/autorelease インスタンスを返すことです。それらは便利なので、それを行う必要はありません。

何かの自動解放バージョンが必要ない場合は、そのようにインスタンス化せず、適切な alloc/init を使用し、完了したら解放してください。このメソッドははるかに明示的であり、例外がスローされた場合にリリース ブロックが失われる可能性があるため、エラーが発生しやすくなりますが、それはそのようにするために支払う代償です。

于 2009-09-23T15:18:51.633 に答える