【问题标题】:Why do I need to 'block copy' when I want to use the block?为什么要使用块时需要“块复制”?
【发布时间】:2013-03-20 10:50:48
【问题描述】:
 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]];

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

我认为,块将在函数后释放,线程将在完成后全部释放......

它将如何导致泄漏?

【问题讨论】:

    标签: objective-c memory-leaks objective-c-blocks


    【解决方案1】:

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

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

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

    【讨论】:

    • 好的...我明白了.. thx,但我不知道为什么泄漏会显示“_Block_copy_internal”注释/
    • @GanLiting detachNewThreadSelector... 保留并使用堆栈上的一个块,这已经破坏了内存。在这种状态下,几乎任何事情都可能发生。使用copy你将解决错误的原因,试图找出损坏的内存如何导致泄漏没有任何意义。
    猜你喜欢
    • 2010-09-17
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 2014-08-27
    • 2010-12-03
    • 1970-01-01
    相关资源
    最近更新 更多