0

彼の著書では、非 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]と、そのオブジェクトは最終的に消え、最終的には同じループ内で新しいオブジェクトに置き換えられます。これは正しい解釈ですか?

最後に、 をリリースすることはありませんが、最後にsum2sum=sum2[sum release]」を実行することで、プログラムにメモリ リークが発生しないようにしていますね。

4

1 に答える 1

0

コメント 1 への WRT:

sum2 = [sum add:aFraction];

この呼び出しは、自動解放されたオブジェクトが返されることを意味します。これは慣例によるものです。で始まるinitか呼び出されたメソッドのみnewが自動解放されていないオブジェクトを返す必要があり、他のすべてのメソッドは自動解放されるはずです。

コメント 2 への WRT:

解放された後sumもポインタは非のままですが、それが指すのは解放されnilた可能性のあるオブジェクトです。この参照を介してオブジェクトにアクセスすると、ある時点で問題が発生します。おそらくすぐに。ポインターは何も所有していません。所有権の概念は、メソッドまたはクラス レベルにあります。例えば

Foo *foo = [[Foo alloc] init];
Foo *foo2 = foo;
Foo *foo3 = foo2;

メソッドは を所有し foo、たまたま同じオブジェクトへの 3 つの参照を持っています。これとreleaseオブジェクトを 1 回だけ覚えていれば問題ありません (オブジェクトへの参照はどれでも使用できreleaseます)。

于 2012-11-14T10:15:30.047 に答える