3

ここにコードがあります

@interface Test : NSObject {
    int val;
}

-(int) GetOne;
@end

@implementation Test
-(int) GetOne {
    return 1;
} 
@end

そして、このように Test クラスを使用します

Test * a = [Test new];
Test * __weak b = a;

[b GetOne];
a = nil;

printf("a=%p, b=%p\n", a, b);

結果は b が 0 ではありません。なぜこれが起こるのですか?

4

2 に答える 2

3

ARC は、メモリ管理呼び出しのジャングルを生成し、不要と判断したものを最適化します。これは、古い手動のメモリ管理とは大きく異なるプロセスです。その点でコンパイラがどのように機能するかを理解することについて、私は主張しません。理解する必要はありません。

ARC は、1 つの約束をする魔法のブラック ボックスと考えてください。ルールに従えば、最終的には自動的にクリーンアップされます。可能な限り早い時期ではないかもしれませんが、それは起こります。

LLVM 4.2 (Xcode 4.6 に付属) を使用していると仮定して、テストしました。オブジェクトは実際に自動解放プールになります。これは、自動解放が実際には必要ないため、ARC の方がうまくいく場合の例です。

その考えに従って、LLVM 5.0 コンパイラ ベータ版でも試してみましたが、動作が異なりますa = nil。期待どおり、オブジェクトはすぐに割り当て解除されます。これは、同じ基本的な約束を維持しながら、よりスマートになっている ARC の良い例です。

于 2013-06-28T02:41:58.867 に答える
0

ARCはオブジェクトを解放して保持するのに役立ちますが....オブジェクトが解放される正確な時間.

非 ARC について読んでから、ARC について読んでください。スタックオーバーフローでそれについて言った人が多すぎます

(これを読むことができます: ARC - __unsafe_unretained の意味? )

于 2013-06-28T02:41:31.597 に答える