如何在另一个块内执行块(没有坏访问)

时间:2013-12-04 11:49:59

标签: ios objective-c block objective-c-blocks exc-bad-access

我的一个方法(mySecondMethod)接收一个块,需要在将该块作为参数传递给另一个方法之前为该块添加一个额外的处理。 这是代码示例:

- (void)myFirstMethod {
    // some code
    __weak MyController *weakSelf = self;
    [self mySecondMethod:^(BOOL finished) {
        [weakSelf doSomething:weakSelf.model.example];
    }];
}

- (void)mySecondMethod:(void(^)(BOOL finished))completion {
    void (^modifiedCompletion)(BOOL) = ^void(BOOL finished){
        completion(finished);
        _messageView.hidden = YES; //my new line
    };
    [UIView animateWithDuration:duration animations:^{
        //my code
    } completion:modifiedCompletion];
}

运行时,我在completion(finished)行遇到错误的访问错误。 completion为NULL。我试图像这样复制块:

void (^copiedCompletion)(BOOL) = [completion copy];
void (^modifiedCompletion)(BOOL) = ^void(BOOL finished){
    copiedCompletion(finished);
    _messageView.hidden = YES; // my new line
};

但仍然有错误。

当我清空完成块时,崩溃仍然发生,因此崩溃不是由于内部的原因。

知道如何解决这个问题吗?谢谢!

1 个答案:

答案 0 :(得分:1)

我认为你因为这个

而得到了糟糕的访问权限
// some code
__weak MyController *weakSelf = self;
[self mySecondMethod:^(BOOL finished) {
    [weakSelf doSomtehing:weakSelf.model.example];
}];

尝试将其更改为。

id example = self.model.example;
[self mySecondMethod:^(BOOL finished) {
    [self doSomething:example];
}];

修改

在调用之前需要复制块。

旁注

在调用块之前进行检查以避免意外崩溃。

if (completion) {
   completion(finished);
}