2011-08-30 6 views
2

次の2つのメッセージ式の結果、同じオブジェクトの保持カウントが増加しますか?これら2つのObjective-Cメッセージ式は、メモリに相当しますか?

例1:

iVar = [Foo aClassMethodInFoo]; 
[iVar retain]; 

例2:それは、そのカウントを保持して増加するIVARインスタンスのことを

iVar = [[Foo aClassMethodInFoo] retain]; 

例1は、明示的です。 例2は、増加した[Foo aClassMethodInFoo]から返されたオブジェクトの保持カウントであることを示唆しているようです。それがそうであれば、aClassMethodInFooが便利な方法であると仮定すると、メモリをリークさせないために以前の「保持」のバランスを取るためにオブジェクトをリリースしますか?

答えて

6

どちらも絶対に同じです。最初のケースでは、メソッド呼び出しの結果を変数に代入し、その変数に-retainを呼び出しています。正味の結果は変数がオブジェクトを保持しており、オブジェクトに対して-retainを呼び出したことです。 2番目のケースでは、メソッド呼び出しの結果について-retainを呼び出し、その結果を変数に代入します。 -retainはレシーバを返すことが保証されているため、結果として変数にオブジェクトが保持され、オブジェクトに対して-retainが呼び出されました。

どちらの場合も、メモリセマンティクスは正確に同じです。 Memory Management Programming Guideで定義されている命名規則によれば、+aClassMethodInFooというメソッドは自動解放されたオブジェクトを返しますので、結果をivarに格納する場合は、-retainへの呼び出しは正しいです。そのように、あなたが完了したら、あなたの象牙に-releaseを呼び出すことができます。あなたが「どのオブジェクトをリリースするか」という質問は無意味です。ここにはオブジェクトが1つしかないからです。

+0

ありがとう、ケビン、明確で有用な答えです。 –

2

classメソッドがvoidではなく新しいオブジェクトを返すと仮定すると、retainはselfを返すだけなので、まったく同じです。

+0

はい、クラス(簡易)メソッドは新しいオブジェクトを返すとみなされます。 –

+0

新しいオブジェクトを返さなかったとしても、それらは同じままです。 –

関連する問題