1
 ProductCenterController __weak *tempSelf = self;

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

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

我发现泄漏 - '_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 回答