1
 ProductCenterController __weak *tempSelf = self;

 void(^block)(void) = ^{
    tempSelf.actIndView = ....
    [tempSelf.view addSubview:tempSelf.actIndView];
};

[NSThread detachNewThreadSelector:@selector(actionForThreadBlock:) toTarget:self withObject:block];

Leak - '_Block_copy_internal'...(私は ARC を使用しています) を見つけ、最後の行コードを次のようなものに変更すると、漏れが見つかりません...:

[NSThread detachNewThreadSelector:@selector(actionForThreadBlock:) toTarget:self withObject:[block copy]];

[ブロックコピー]を使用しないと、なぜリークが発生するのですか????

関数の後にブロックが解放され、終了後にスレッドがすべて解放されると思います...

どのように漏れを引き起こしますか?

4

1 に答える 1

1

ブロックはスタック上に作成されるため、メソッド (スコープ) が終了すると解放されます。スレッドが既に割り当て解除されたブロックを実行しようとした後、例外で終了します。

Copyブロックをスタックからヒープ メモリに移動するため、元のメソッドが終了した後も有効になります。

この件について詳しく説明する場合は、Apple のドキュメントを参照してください。

于 2013-03-20T11:13:46.433 に答える