彼の著書では、非 ARC 環境での第 7 章の次のコードを検討してください。
Fraction *aFraction = [[Fraction alloc] init];
Fraction *sum=[[Fraction alloc] init],*sum2;
int i, n=5, pow2=2;
[sum setTo: 0 over: 1];
for (i = 1; i <= n; ++i){
[aFraction setTo: 1 over: pow2];
sum2 = [sum add:aFraction]; // Comment 1
[sum release];
sum = sum2; // Comment 2
pow2 *=2;
}
[sum doSomething];
[sum release];
誰かが私の理解が正しいことを確認できますか:
注、コメント 1 - このadd
関数が割り当てられたオブジェクト fyi を返すことはわかっているのでsum2
、オブジェクト (自動解放されていないオブジェクト) を所有しています (本の他のコードに従って)。
質問、コメント 2 - リリースsum
しました -sum
に「割り当て」られるまで、単に空のポインタとして存続しsum2
ます。sum2
はオブジェクトを所有しているため、コメント 1 で割り当てられた新しいオブジェクトが割り当てられた場合、前sum2
の反復sum
からのオブジェクトの唯一の所有者のままであり、a[sum2 release]
は必要ありません。コメント 2 のすぐ上で発生する[sum release]
と、そのオブジェクトは最終的に消え、最終的には同じループ内で新しいオブジェクトに置き換えられます。これは正しい解釈ですか?
最後に、 をリリースすることはありませんが、最後にsum2
「sum=sum2
[sum release]」を実行することで、プログラムにメモリ リークが発生しないようにしていますね。