声明块内联方法调用时访问错误

时间:2012-09-25 00:10:24

标签: ios automatic-ref-counting objective-c-blocks xcode4.5

我们正在研究一些调用枚举方法的代码:

- (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。显然我们都知道块应该可以声明内联。这让我得出结论,错误不是在调用方法时,而是在这个项目的某个地方崩溃。

1 个答案:

答案 0 :(得分:0)

我非常确定您的问题的根本原因是当该方法返回时,您的块参数确实超出了范围。我的理解是,带有块参数的Apple类会立即将一个block_copy()放入一个ivar(即块foo = block_copy(参数))。