0

次のコードがありますが、obj2 が解放されても obj1 が保持されることを期待していますが、動作しますか?

obj1 = [[Class1 alloc] init];
obj2 = [[obj1 retain] autorelease];
4

2 に答える 2

4

次のコードがありますが、obj2 が解放されても obj1 が保持されることを期待していますが、動作しますか?

obj1とはどちらも同じオブジェクトobj2へのポインタです。そのオブジェクトは、作成時に保持カウント 1 を取得します。2 行目で再度保持すると、オブジェクトの保持カウントは 2 に増加します。したがって、オブジェクト (およびそれへのポインター) は、2 回解放されるまで有効なままになります。これらのリリースの 1 つは、最終的には 2 行目から行われます。別のコードは、コードのどこかに提供する必要があります。autorelease

于 2012-08-08T16:19:06.623 に答える
2

それはうまくいきますが、あなたの結論が正しいかどうかはわかりません(その上で解析エラーがありました)。

obj1 = [[Class1 alloc] init];
obj2 = [[obj1 retain] autorelease];

デルタと参照ごとの観点から保持と解放を考えると役立ちます。したがって、次のコードでは、「obj1 参照の保持カウントは +1 です」および「obj2 参照の保持カウントは +0 です」と言えます。

つまり、obj1は強参照でobj2あり、弱参照です。

オブジェクトを消したい場合は、[obj1 release]. できます [obj2 release]、それは所有権の譲渡を意味し、正当な理由がある場合にのみ、非常に明示的に行う必要があります。

または、ARC をオンにするだけで完了できます。

于 2012-08-08T16:53:04.193 に答える