0
__block BOOL myBool = NO;
__strong MyClass *ptr = self;
self.footer.defaultSelectedItem.selectionBlock = ^{
    myBool = YES;
    ptr = nil;
};

当我的 Scheme 的Build Configuration设置为Debug时,这工作得很好,但是当我使用ReleaseEXC_BAD_ACCESS运行时,我得到了一个。发生在以下行EXC_BAD_ACCESS

if(selectionBlock != nil) selectionBlock();

但是如果我注释掉我里面的所有行,selectionBlock那么它运行没有错误。为什么它在 Debug 中运行而不是在 Release 中运行?

仅供参考,我正在使用自动引用计数(弧)

** 编辑以回应@RobNapier **

在调试中工作的原始代码是:

__block BOOL flag = NO;
__strong EventsView *ptr = self;
self.footer.defaultSelectedItem.selectionBlock = ^{
    if(flag) return;
    flag = YES;
    [ptr backTUI:nil];
    flag = NO;
};
4

2 回答 2

1

这里没有额外的理由ptr。在块内使用self会更正确。在这种情况下,该块将保留self。这可能会导致保留循环,因此您需要记住在打破保留循环self.selectionBlock = nil之前的某个时间点进行设置。dealloc

flag可以在这里优化。目前尚不清楚从上面的代码中它如何可能有用。

我总是对像这样的集合操作中的长间接链感到非常紧张:

self.footer.defaultSelectedItem.selectionBlock = ...

我会确保footer,并且在此运行之前电流 defaultSelectedItem不会消失。

简化问题。使块只记录“运行块”。然后添加东西直到它崩溃。

于 2012-05-11T17:55:22.837 回答
0

对于我的一生,我无法让它与块一起使用。因此,我改为使用事件视图指针的设置器。我猜想通过设置一个额外的 ARC 保留来解决我的指针问题。我仍然不确定,因为我从未见过僵尸在使用该块时被记录,所以是的。

如有疑问,请使用选择器。

于 2012-05-14T16:03:03.133 回答