次のコードがありますが、obj2 が解放されても obj1 が保持されることを期待していますが、動作しますか?
obj1 = [[Class1 alloc] init];
obj2 = [[obj1 retain] autorelease];
次のコードがありますが、obj2 が解放されても obj1 が保持されることを期待していますが、動作しますか?
obj1 = [[Class1 alloc] init];
obj2 = [[obj1 retain] autorelease];
次のコードがありますが、obj2 が解放されても obj1 が保持されることを期待していますが、動作しますか?
obj1
とはどちらも同じオブジェクトobj2
へのポインタです。そのオブジェクトは、作成時に保持カウント 1 を取得します。2 行目で再度保持すると、オブジェクトの保持カウントは 2 に増加します。したがって、オブジェクト (およびそれへのポインター) は、2 回解放されるまで有効なままになります。これらのリリースの 1 つは、最終的には 2 行目から行われます。別のコードは、コードのどこかに提供する必要があります。autorelease
それはうまくいきますが、あなたの結論が正しいかどうかはわかりません(その上で解析エラーがありました)。
obj1 = [[Class1 alloc] init];
obj2 = [[obj1 retain] autorelease];
デルタと参照ごとの観点から保持と解放を考えると役立ちます。したがって、次のコードでは、「obj1 参照の保持カウントは +1 です」および「obj2 参照の保持カウントは +0 です」と言えます。
つまり、obj1
は強参照でobj2
あり、弱参照です。
オブジェクトを消したい場合は、[obj1 release]
. できますが [obj2 release]
、それは所有権の譲渡を意味し、正当な理由がある場合にのみ、非常に明示的に行う必要があります。
または、ARC をオンにするだけで完了できます。