0

オブジェクト A があるとします。

A は B を強く参照している

B は C を強く参照している

ここで、A への最後の参照が削除されたとします。A がスタックにあり、関数が終了するとします。

だからAは消えた。

それが死にかけているとき、AはBにそれがなくなったことを通知しますか? BとCもなくなるの?

-(void) foo
{
A * a= [[A alloc]init];
A.b = [[B alloc]init];
A.b.c = [[C alloc]init];
//end of function what happen here? Will a, A.b and A.b.c gone too? How exactly that work?
}
4

3 に答える 3

3

A はヒープにあります (ポインタはスタックにあります)。そして...はい..オブジェクトへの強い参照がなくなった場合、すぐに解放されます。

ARC はガベージ コレクターではありません。これは単なるコンパイル時の機能です。オブジェクトに保持、解放、および自動解放ステートメントを自動的に追加します。ARC モードでは、dealloc メソッドは自動的に B の release を呼び出します。B の dealloc メソッドは C の release を呼び出します。

ところで: dealloc メソッドを実装できます。その中でリリースを呼び出すことはできません..そのため、ソケットを閉じたり、リソースを解放したりできます....

于 2012-06-19T06:35:24.090 に答える
1

ARC を使用し、これらの参照を強いものとしてマークすると、コンパイラは dealloc メソッドでこれらのオブジェクトへの解放呼び出しを確実に合成します。

したがって、はい、オブジェクト B と C への参照が他にないと仮定すると、それらは A の死にゆく息の一部として解放されます :)

于 2012-06-19T06:34:57.813 に答える
1

クラスは、割り当てが解除されたときに参照を解放する必要があります。

ARC がここで何かを変更するとは思いません (リリース呼び出しを自動的に挿入することを除いて)。

于 2012-06-19T06:27:12.187 に答える