2013-03-20 52 views
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]]; 

如果我不使用[块复制],为什么它会导致泄漏?

我认为,该块将功能后释放后完成线程将释放所有...

怎么会导致泄漏?

回答

1

块被创建在堆栈上,所以当你的方法(作用域)结束时它们被释放。在你的线程尝试执行已经释放的块之后的一段时间,以异常结束。

Copy将块从堆栈移动到堆内存,所以即使在原始方法结束后它仍将存活。

请在广泛讨论主题时参阅Apple文档。

+0

ok ......我看到.. thx,但我不知道为什么泄漏会显示“_Block_copy_internal”note/ – GanLiting 2013-03-20 11:19:28

+0

@GanLiting'detachNewThreadSelector ...'保留并使用堆栈上的块并且已经损坏了内存。在这种状态下,几乎任何事情都可能发生使用'copy'你可以解决错误的原因,试图找出内存损坏是如何导致泄漏没有任何用处的。 – Sulthan 2013-03-20 12:13:53

相关问题