我们正在研究一些调用枚举方法的代码:
- (void)enumerateRangesOfString:(NSString*)string usingBlock:(void (^)(const NSRange range, volatile BOOL * const stop))block;
这一切都很好,直到我们切换到ARC。
当我们查看调用它的代码时,如果我们唯一地声明了块,应用程序就会停止崩溃:
id block = ^(const NSRange range, volatile BOOL * const stop) {
[solutions_ addObject:object];
};
[[puzzle_ stringForSolution:solution enumerateRangesOfString:word usingBlock:block];
当块在线方式声明方法调用时,应用程序崩溃了。我们(我)并不知道为什么会解决这个问题,但是我还是坚持了下去,因为我不想一直抨击我的头。
问题是,在调用方法时,对于块的每个内联声明,这似乎都是正确的。我将AFNetworking库添加到应用程序后,我的应用程序一直崩溃。问题是我并不想真正想要修改这个库的所有代码,我假设我的代码有问题。当我保留内联声明的块时,这个问题继续导致崩溃,而不是当我拉出块并单独声明它时。
我在其他几个应用中使用AFNetworking。显然我们都知道块应该可以声明内联。这让我得出结论,错误不是在调用方法时,而是在这个项目的某个地方崩溃。
答案 0 :(得分:0)
我非常确定您的问题的根本原因是当该方法返回时,您的块参数确实超出了范围。我的理解是,带有块参数的Apple类会立即将一个block_copy()放入一个ivar(即块foo = block_copy(参数))。