我按照以下准则编写了一个递归块:
NSMutableArray *groups = [NSMutableArray arrayWithArray:@[@"group1", @"group2", @"group3", @"group4"];
__block CommunicationCompletionHandler completion = [^{
[groups removeObjectAtIndex:0];
if ([groups count] > 0) {
// This will send some information to the network, and calls the completion handler when it receives a response
[mySocket saveGroup:groups[0] completion:completion];
}
} copy]; // Removing copy here doesn't work either
[mySocket saveGroup:groups[0] completion:completion];
在该saveGroup:completion:
方法中,我将完成处理程序添加到数组中:
self.completionHandlers[SaveGroupCompletionHandlerKey] = [completion copy];
当我收到响应时,我调用以下方法(key
在这种情况下为 is SaveGroupCompletionHandlerKey
):
- (void)performCompletionHandlerForKey:(NSString *)key {
if (self.completionHandlers[key]) {
((CommunicationCompletionHandler)self.completionHandlers[key])();
[self.completionHandlers removeObjectForKey:key];
}
}
问题是完成处理程序只被调用一次。该removeObjectForKey:
行使块解除分配。如果我取消注释该行,一切正常。我不确定数组是如何最后引用这个块的,因为我添加了 a copy
(我相信它正在被优化为 a retain
)。
为清楚起见,应用程序的流程是:
- 通过网络为第一组发送数据
- 收到回复
- 调用完成处理程序
- 在完成处理程序中,为下一组发送数据(这是递归部分)。
这里有人能指出我做错了什么吗?