复制或保留Block时EXC_BAD_ACCESS

时间:2011-08-18 17:26:31

标签: iphone objective-c exc-bad-access objective-c-blocks

据我所知,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,一切都按预期运行。

1 个答案:

答案 0 :(得分:26)

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

基本上我必须从链接器标志中删除-weak_library /usr/lib/libSystem.B.dylib并将其替换为-weak-lSystem