2009-09-04 9 views
3

私はMac OS X用のCocoa Programmingの最初の章をもう一度読んでおり、著者はNSCalendarDateのクラスメソッドの1つがオートレリースオブジェクトを返すと述べています。私はいつも、すべてのクラスメソッドがオートレリースオブジェクトを返したとします(allocが関わっていないので)。すべてのクラスメソッドは自動解放されたオブジェクトを返しますか?

具体的に保持する必要があるクラスメソッドはありますか?

ありがとうございました。

+1

技術的には、メソッドが自動解放されたオブジェクトを返さなかった場合、結果を保持する必要はありません。すでに保持されているか、コードがバグになり、返されたオブジェクトがすでに割り当て解除されている可能性があります。 – Chuck

答えて

22

クラスメソッドは、インスタンスメソッドと同じように、標準Cocoa memory management rulesに準拠する必要があります。あなたは名前が 「のalloc」または「新しい」または は、「コピー」を含んでいる(例えば、アロケーション、 でnewObject、またはmutableCopy)で始まるメソッドを使用して作成し 場合は、オブジェクトの所有権を取得

、または の場合はメッセージを送信してください。 リリースまたは自動リリースを使用して所有しているオブジェクトの所有権を放棄する責任を負います。それ以外の時間をお持ちの場合は 、 はリリースしないでください。

おそらく彼らは、自動リリースされたオブジェクト、またはそのようなシングルトンなどへの参照を返すでしょう。いずれにしても、オブジェクトが "alloc"または "new"で始まるか、または "copy"で始まらない限り、オブジェクトを解放する必要はありません。現在の自動解放プールの範囲を超えて、iVarなどに格納することによって、それを保持しない限り、保持する必要はありません。

+3

1つの点を明確にする:シングルトンの場合*クラス*はその唯一のインスタンスを所有しているため、それを解放または自動解放しないのです。それ以外の場合( 'stringWithUTF8String:'など一般的に便利なファクトリメソッド)では、クラスはインスタンスを所有するつもりはないので、自動的に解放します。 –

+1

Joeyが言ったことを強調するために、あなたが心配するのは、Cocoaのメモリ管理ルールで述べられているオブジェクトの所有権だけです。問題は「返されたオブジェクトを所有していますか」ではなく、「私はautorelease itというメソッドを実行しましたか」です。良い答えは –

+0

+1です。私の答えはもう少し分析してください。 –

0

一般的なルールは、メソッドの名前にalloc、new、またはcopyが含まれていて、それを所有している場合です。そうでなければ、それはオートレリースされているかもしれないし、他の誰かが世話をしている、つまりそれを所有していないので心配する必要はない。

1

便利な方法は、通常、自動リリースされたオブジェクトを返します。例えば。 [NSMutableArray配列]は[[[NSMutableArray alloc] init] autorelease]と同等です。

これらがクラスメソッドであるという事実は、すべてのクラスメソッドが自動解放されたオブジェクトを返すという結論に導くべきではありません。これは命名規則に関するものです。 menthodにalloc *、コピー、new * nameがある場合、返されたオブジェクトの所有者になります。私。あなたに渡されたときに少なくとも1の保持カウントを持ちます。

1

それは、そのクラスのメソッドを覚えておく価値があるは全くのオブジェクトを返すようにを持っていない - のいずれかの方法は、(などの構造体、プリミティブ型を含む)または何も(ボイド)を返すことができます。 Objective-C言語には、所有されていないオブジェクトを返すためのクラスメソッドが必要なものは何もありません(つまり、呼び出し側が解放/自動解放する必要はありません)。

つまり、@ジョーイの答えは素晴らしいです。オブジェクトを返すクラスメソッドの経験則は、オートレリースする必要があるということです。クライアントコードでメモリリークが発生しないように、規約違反を明確に文書化する必要があります。

関連する問題