复制或保留Block时EXC_BAD_ACCESS

Jon*_*an. 16 iphone exc-bad-access objective-c objective-c-blocks

据我所知,Block就像一个对象,因为你可以向它发送复制或释放消息,例如:

[myBlock copy];
Run Code Online (Sandbox Code Playgroud)

但是每当我这样做或释放一个块时,我都会得到EXC_BAD_ACCESS.

如果我使用块函数,一切都按预期工作,例如:

Block_copy(myBlock);
Run Code Online (Sandbox Code Playgroud)

我认为释放和复制块的两种方式都是相同的?

这不是一个问题,但如果我有一个Block的属性(副本)有点烦人,我必须自己编写setter方法.

例如:使用属性:

//Header
@property (nonatomic, copy) void (^cancelledBlock)(void);

//Implementation
@sythesize cancelledBlock;
Run Code Online (Sandbox Code Playgroud)

设置时会导致EXC_BAD_ACCESS cancelledBlock

但如果我这样做:

//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);

}
Run Code Online (Sandbox Code Playgroud)

没有EXC_BAD_ACCESS,一切都按预期运行.

Jon*_*an. 26

经过漫长而无聊的下午和晚上,我终于在这里遇到了这个答案,虽然看起来似乎无关,但我访问过的网站连锁店却创造了这种关系.

基本上我不得不-weak_library /usr/lib/libSystem.B.dylib从链接器标志中删除并替换它-weak-lSystem.