据我所知,Block就像一个对象,因为你可以向它发送复制或释放信息,例如:
[myBlock copy];
但是每当我这样做或释放一个块时,我都会得到EXC_BAD_ACCESS。
如果我使用块功能,一切都按预期工作,例如:
Block_copy(myBlock);
我认为发布和复制块的两种方式都是相同的?
这不是一个问题,但如果我有一个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,一切都按预期运行。
答案 0 :(得分:26)
经过漫长而无聊的下午和晚上,我终于遇到了这个answer here,虽然看起来似乎无关,但我访问过的网站连锁店却创造了这种关系。
基本上我必须从链接器标志中删除-weak_library /usr/lib/libSystem.B.dylib
并将其替换为-weak-lSystem
。