当我想使用该块时,为什么需要“阻止复制”?

时间:2013-03-20 10:50:48

标签: 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];

我发现泄漏 - '_Block_copy_internal'......(我使用ARC) 然后当我将最后一行代码更改为这样的时候,漏洞就丢失了......:

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

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

我认为,该块将在该函数之后释放,并且线程将在完成后释放所有...

它会如何导致泄漏?

1 个答案:

答案 0 :(得分:1)

在堆栈上创建块,因此在方法(范围)结束时释放它们。一段时间后,你的线程将尝试执行已经解除分配的块,以异常结束。

Copy将块从堆栈移动到堆内存,因此即使在原始方法结束后它也会存在。

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