/ /ブロックを使用するにはなぜコピーをブロックする必要がありますか? - objective-c、memory-leaks、objective-c-blocks

なぜブロックを使用したいのですが、ブロックコピーをする必要がありますか? - objective-c、memory-leaks、objective-c-blocks

 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]];

[ブロックコピー]を使用しないと、なぜそれがリークを引き起こすのでしょうか?

私は、ブロックが関数の後にリリースされ、スレッドがすべての終了後に解放されると思う...

どのようにリークを引き起こすでしょうか?

回答:

回答№1は1

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

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

件名が広範囲に議論されている場合は、アップルのマニュアルを参照してください。