3

我有一个对象链。存在链上的对象以很好地划分功能。完成块向上传递,我想如果另一个对象想向完成块添加东西,我可以将完成块包装在相同类型的块中,调用第一个块,一切都会是 ace。我得到 EXC_BAD_ACCESS。我的语法是错误的还是我完全以错误的方式处理这个问题?

-(void)archiveChatWithDictionary:(NSDictionary*)dictionary andCompletionBlock:(ServerConnectionCompletionBlock)completionBlock
{
    ServerConnectionCompletionBlock localCompletionBlock = ^(ServerConnection *connection, NSError *error) {

        // Do some stuff
        // ...

        //  This line produces EXC_BAD_ACCESS
        completionBlock(connection, error);
    };    

    [self.chatEndpointInterface archiveChatWithDictionary: dictionary andCompletionBlock: localCompletionBlock];
}
4

2 回答 2

3

最后,completionBlock 是否被复制(或内联在被复制的块中)?

默认情况下,块存储在堆栈中。如果你想保留一个块(通常是完成块),你必须复制它(所以它移动到堆中)。

好消息是,如果你复制一个块,所有嵌套的块也将被复制。

于 2012-07-19T00:58:39.250 回答
0

我正在做完全相同的事情,并且运行良好。

不过,我确实遇到了崩溃,结果发现被包裹的块​​是 nil。也许你可以检查一下。

我建议断言该块不是 nil 或在块调用之前放置一个 if 语句,具体取决于您的具体情况。

于 2012-09-26T08:43:20.693 回答