2009-09-23 14 views
17

私は知らないうちにいくつかのオブジェクトがオートリリースされているのを少し迷惑にしています。彼らがいることはおそらく良いことですが、もしそうなら、私は知りたいのです。ドキュメンテーションはどのメソッドがオートレリースオブジェクトであるかを示していないので、私は通常自分の考え方をテストします。私の意見では愚かです。たとえば、[NSDate date]はオブジェクトをオートレースします。[NSArray arrayWithObjects:...]も同様です。あなたが書類を書いていないとどうやって知っていますか?オブジェクトがオートレリースされているかどうかを知る方法?

静的関数を持つオブジェクトを作成するメソッドは、常に自動解放されたオブジェクトを返しますが、パターンが見え始めています。これはいつも真実ですか?

+0

私はあなたが "静的関数"ではなく "クラスメソッド"( "インスタンスメソッド"とは対照的に)を意味すると信じています。以下で解説するように、+/-は返されたオブジェクトがオートリリースされたかどうかを判断しません。それは規約と簡単なルールの問題です。ほとんどのメソッドは保持しなければならないオブジェクトを返します。+ 1の保持カウントを持つオブジェクトを返すメソッドは、ルールではなく例外です。 –

+0

クラスメソッド私は確かに意味しました。私はJavaの用語から "静的"を使用し、何らかの理由で "関数"を使用しましたが、 "メソッド"であったはずです。まあ、とにかくメモリ内ではまったく同じです。 :) – quano

答えて

21

基本的には、initcopy、またはretainのオブジェクトをリリースする必要があります。そうしないと、あなたはそれを解放する責任を負いません。

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

多くのクラスは、クラスの新しいインスタンスを取得 に使用することができます... 形+ classNameの方法を提供します。 「コンビニエンス コンストラクタ」と呼ばれることもありますが、これらのメソッドは クラスの新しいインスタンスを作成し、 を初期化して使用するために返します。 この方法で作成された オブジェクトをリリースするのは だと思われるかもしれませんが、これは という所有権のケースに従うものではありません。 クラスは新しいオブジェクトを作成するため、新しい オブジェクトを廃棄するのは、 です。

+0

これも良い答えです。 – bobobobo

4

メソッドのシグネチャ自体が通知します。 "classNameWithData:data1:data2"のようなシグネチャを持つメソッドへのパターンは、そのことのalloc/init/autoreleaseインスタンスを返すことです。彼らは便利なので、あなたはそれをする必要はありません。

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

+0

+1。オブジェクトを取得するためにalloc/initを使用していない場合は、それがオートリリースされていると想定し、適切に処理します。 – Abizern