据我所知,Block 就像一个对象,您可以向它发送复制或发布消息,例如:
[myBlock copy];
但是,每当我这样做或释放一个 block 时,我都会得到 EXC_BAD_ACCESS。
如果我使用 block 函数,一切都会按预期工作,例如:
Block_copy(myBlock);
我以为释放和复制 block 的两种方式是相同的?
这不是什么大问题,但有点烦人的是,如果我有一个属性(副本)是一个 block ,我必须自己编写 setter 方法。
例如:具有属性:
//Header
@property (nonatomic, copy) void (^cancelledBlock)(void);
//Implementation
@sythesize cancelledBlock;
设置 cancelledBlock
时导致 EXC_BAD_ACCESS
但如果我这样做:
//Header
@property (nonatomic, copy) void (^cancelledBlock)(void);
//Implementation
@sythesize cancelledBlock; //saves me doing the getter as well
- (void)setCancelledBlock:(void (^)(void))aCancelledBlock {
if (cancelledBlock == aCancelledBlock) {
return;
}
void (^oldValue)(void) = cancelledBlock;
cancelledBlock = Block_copy(aCancelledBlock);
Block_release(oldValue);
}
没有 EXC_BAD_ACCESS,一切正常运行。
最佳答案
经过漫长而无聊的下午和晚上,我终于看到了这个 answer here ,虽然它可能看起来无关,但我为找到它而访问的网站链创建了这种关系。
基本上我必须从链接器标志中删除 -weak_library/usr/lib/libSystem.B.dylib
并将其替换为 -weak-lSystem
。
关于iphone - EXC_BAD_ACCESS 复制或保留 Block 时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7111541/