我在委托方法中创建了一个块,我用它来调用另一个类中的静态方法。即使我启用了NSZombies,我也会收到EXC_BAD_ACCESS错误。这里有一些关于类似问题的帖子 - 我认为这是最接近的:
ARC: Getting EXC_BAD_ACCESS from inside block used in delegate method
但是,到目前为止我还没有发现任何有帮助的东西。这是代码:
@interface MyClass()
@property (nonatomic, copy) CaseBlock c;
@end
....
//NSURLConnection delegate method
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys:
//blows up after executing this
^() { [AnotherClass staticMethod]; },authURL,
^() { NSLog(@"TODO");}, searchURL,
^() { NSLog(@"TODO"); }, itemURL,
nil];
self.c = [[d objectForKey:[self.url path]] copy];
if (self.c) {
self.c();
} else { NSLog(@"WARN unexpected response path"); }
}
这是我第一次尝试使用块,但我可以说这导致了问题,因为从块外部调用方法可以正常工作。而且,据我所知,我编写的所有代码实际上都被执行了,然后发生了EXC_BAD_ACCESS错误。但是,我是Objective-C的新手,所以如果我错了,请纠正我。
答案 0 :(得分:9)
你需要复制块,如果它们需要比它们创建的范围更长。由于dictionaryWithObjectsAndKeys:
一般处理对象而不是特定块,它不知道要复制它们,所以你必须复制它们在将它们传递给它之前。
NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys:
//blows up after executing this
[^() { [AnotherClass staticMethod]; } copy], authURL,
[^() { NSLog(@"TODO");} copy], searchURL,
[^() { NSLog(@"TODO"); } copy], itemURL,
nil];