このメソッドgetFoo
は、保持カウントが0のオブジェクトを返しません。これは、保持カウントが+0のオブジェクトを返します。これは、次のことを意味します。
- オブジェクトの保持カウントがnullではありません(そうでない場合、オブジェクトは存在しません)
- また、保持カウントはメソッドの呼び出しによって変更されなかったか、変更された場合は、バランスの取れた方法で変更されました(/ / /
release
/とautorelease
同じ数)。retain
alloc
new
copy
したがって、オブジェクトの存続期間は、オブジェクトがどこにどのように保持されるかに完全に依存します。メソッドの呼び出しによってオブジェクトが解放される可能性があるため、オブジェクトが有効になる期間はわかりません。
たとえば、次のコードについて考えてみましょう。
id anObject = [anArray objectAtIndex:0];
[anArray removeObjectAtIndex:0];
オブジェクトanObject
を削除したため、オブジェクトは配列によって保持されなくなりました。したがって、破壊された可能性があります(ただし、他の場所でまだ使用されているためではない可能性があります)。
alloc
一般に、メソッド( copy
、、、new
または以外)からオブジェクトを取得する場合、次のretain
ように想定できます。
- オブジェクトが保持されてから自動解放されるか、
- オブジェクトは、それを返したオブジェクトによって保持されます。
したがってfoo
、現在のメソッド/関数から戻るか、オブジェクトの状態を変更するメソッド/関数を呼び出すまで、オブジェクトが有効であることがわかりますbar
。その後、破壊された可能性があります。
したがって、あなたの場合、retain
/release
ペアを安全に省略できます。
ただし、呼び出すすべてのメソッドの実装を知らない限り、オブジェクトが解放されないことを保証することは非常に困難です。したがって、取得したすべてのオブジェクトを保持(次に解放)する方が安全な方法であり、ARC(自動参照カウント)を有効にするとコンパイラーがそれを実行します。
retain
しかし、それはあなたがたくさんの/を書くことを要求するでしょう、release
そしてあなたのコードは読み、理解しそして維持するのが難しくなるでしょう。さらに、コードを書くほど、バグが増えます(バグを書かない場合を除く)。
結論として、オブジェクトが消滅する可能性があると疑う理由がない限り、オブジェクトを保持する必要はありません。