0

我有这个方法需要一个块,但并不总是调用那个块。见方法:

- (void)updateWithCompletion:(void (^)(void))completion {
    [MYObject myMethodWithCompletion:^(NSArray *array, NSError *error) {
        if (error) {
            NSLog(@"%s, ERROR not nil", __FUNCTION__);
            completion();
            return;
        }

        NSLog(@"%s, calling completion %d", __FUNCTION__, &completion);
        completion();
        NSLog(@"%s, finished completion", __FUNCTION__);
    }];
}

我有更多的 NSLogs 在里面完成。有时,这个程序计数器会直接超过上面代码中对 completion() 的调用。我不明白为什么会这样,因为调用代码总是将文字代码块作为输入传递。

如果您对包含 addressof 运算符的行的输出感到好奇,它总是不同的东西,但绝不是 0 或 nil。

什么会导致完成不被执行?

4

2 回答 2

1

事实证明,完成指向的代码块与我预期的不同。updateWithCompletion 是从 viewWillAppear 使用空代码块调用的。这就是为什么我没有看到 NSLog 语句的原因。一旦我看到我有一个空代码块,如何解决问题就很明显了。

经验教训:如果代码块为零,程序将崩溃。这没有发生,所以这意味着它正在调用与我预期不同的东西。

希望这可以帮助某人。

于 2012-12-11T00:11:18.243 回答
0

你是什​​么意思,程序计数器吹过块?完成块几乎总是异步执行。这意味着,是的,程序计数器将从调用之前-myMethodWithCompletion:直接跳转到方法的末尾,然后返回给调用者。然后在将来的某个时候,将调用完成块。

于 2012-12-10T23:02:38.107 回答