我在委托方法内创建了一个块,并使用它在另一个类中调用静态方法。即使启用NSZombies,我也会收到EXC_BAD_ACCESS错误。这里对于有关类似问题的几个职位 - 我觉得这一个是最接近:ARC: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的新手,所以如果我错了,请纠正我。
我做了一个更简化的示例代码版本,并没有得到崩溃。你说它在实例化字典时崩溃了? –
不完全超熟悉块,但我的猜测是块不是对象(就像一个int),所以你不能把它当作一个对象,因此你不能把它放到字典中。 – TheAmateurProgrammer
@TheAmateurProgrammer块可以视为对象('id')。据我所知,他们只响应一个选择器“副本”。如果从内存堆栈复制它们,可以安全地存储在集合中。 – Tricertops