1

ブロックに関する調査を行っています。コードはこちら

typedef NSString* (^MyBlock)(void);
@property(copy,nonatomic) MyBlock block1;

表示中

self.block1 = ^{
    self
    NSLog(@"do block");
    return @"a";
};

もちろん、自己は保持されます。

self.block = nil;

自己の保持回数を確認すると、1 減っていて、保持サイクルがないことがわかりました。

これは正しい状況だと思います。ブロックは自己を保持し、ブロックを解放すると自己が解放されます。保持カウントが減少しました。

私は少し変更を加えましたが、物事は奇妙です:ブロックをローカル変数にします。

表示中

MyBlock block1 = ^{
    self
    NSLog(@"do block");
    return @"a";
};

[block copy]; // retain count of self gets added.
[block release];  // retain count of sell still the same

なぜ?Block_release() を試しましたが、同じです。NSArray のようなローカル変数をブロックに入れると、保持カウントは self と同じルールに従います。

@property の内部には何か違うものがあるに違いありません。以前にこれを調査した人はいますか? 助けてください。

さらに、私はARCでこれを行います。ローカル変数ブロックは保持サイクルを作成し、インスタンス変数は自動解放のために自己を保持し、数秒後に解放され、自己オブジェクトが正常に解放されます。

インスタンス変数とローカル変数がメモリ内の異なる部分に割り当てられているためですか?スタック?、[ブロックコピー]を行うと、両方ともヒープにコピーされますか?

EDIT : インスタンス変数とローカル変数ではありません。@property を使用すると違いますが、説明はありますか?

4

1 に答える 1

1

問題は、retainCountこのようなことを理解するために使用しても無駄だということです。は状態をretainCount反映せずautorelease、コンパイラー (特に ARC コンパイラー) は異なるコードを生成する可能性があります (特に、オプティマイザーは不要な保持/自動解放のペアを排除する傾向があります)。

Allocations Instrument を使用して、参照イベント トラッキングをオンにします。次に、オブジェクトの各保持/解放イベント、イベントが発生した正確なスタック トレースを確認し、何が起こっているかを正確に知ることができます。

非 ARC では、iVar に割り当てても何も起こりません。セッターを通過すると、retainセッターはオブジェクトをretaindにします。ARC では、多くの場合、ブロックは自動的にヒープにコピーされ、ブロックがコピーされると、キャプチャされたオブジェクトの保持がトリガーされます。

http://www.whentouseretaincount.com/

于 2013-09-01T05:04:47.830 に答える