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