3

私は使用することになっていることを知っています:

ObjectClass *tmpObject = [[ObjectClass alloc] init];
realObject = tmpObject;
[tmpObject release]

初期化するrealObject(realObjectはクラス内のオブジェクトです)

しかし、ARC モードでは自動で解放されますが、このテクニックを使用する必要はありますか? 単純に使用できますrealObject = [[ObjectClass alloc] init];か? そうでない場合、漏れる特定の理由はありますか?

ありがとう

4

2 に答える 2

16

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];
于 2011-06-26T16:50:11.663 に答える
4

-fobjc-arc を使用して (つまり、ARC を使用して) コンパイルする場合、 を呼び出す必要がないだけでなく、呼び出すreleaseとコンパイラ エラーになります。ARC を使用する場合、挿入retainしてrelease呼び出すのはコンパイラの仕事です。

于 2011-06-26T07:20:27.970 に答える