Spencerが言ったように、ARCを有効にしてコンパイルすると、まったく呼び出すことができませんrelease
。これを行うのはエラーであり、コンパイラが自動的に処理します。
でも:
ObjectClass *tmpObject = [[ObjectClass alloc] init];
realObject = tmpObject;
[tmpObject release]
そのtmpObject
場合、ARCと手動の保持リリースの両方でまったく意味がありません。実際、手動の保持リリースでは、上記のコードは割り当てられたオブジェクトをすぐに解放し、割り当てを解除して(ObjectClass
内部で何か奇妙なことをしない限り)realObject
、ダングリングポインターを残します。
つまり、そのコードは、記述されているように、誰かが最初にメッセージを送信しようとしたときにクラッシュを引き起こしますrealObject
。
明確にするために:
ObjectClass *tmpObject = [[ObjectClass alloc] init];
// tmpObject now contains a reference to an instance of ObjectClass; say, 0x12340
realObject = tmpObject;
// realObject now contains a reference to that same instance; realObject == 0x12340
[tmpObject release]
// this releases the object
// both tmpObject and realObject now reference a deallocated object; much hilarity ensues.
ARCの場合、これを行うだけです。
realObject = [[ObjectClass alloc] init];