ARC:在委托方法中从块内部调用方法时的EXC_BAD_ACCESS

min*_*nus 4 exc-bad-access objective-c objective-c-blocks

我在委托方法中创建了一个块,我用它来调用另一个类中的静态方法.即使我启用了NSZombies,我也会收到EXC_BAD_ACCESS错误.这里有一些关于类似问题的帖子 - 我认为这个是最接近的:

ARC:从委托方法中使用的内部块获取EXC_BAD_ACCESS

但是,到目前为止,我还没有找到任何有帮助的东西.这是代码:

@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"); }

}
Run Code Online (Sandbox Code Playgroud)

这是我第一次尝试使用块,但我可以说这导致了问题,因为从块外部调用方法可以正常工作.而且,据我所知,我编写的所有代码实际上都被执行了,然后发生了EXC_BAD_ACCESS错误.但是,我是Objective-C的新手,所以如果我错了,请纠正我.

new*_*cct 9

如果块需要比它们创建的范围更长,则需要复制块.由于dictionaryWithObjectsAndKeys:一般处理对象而不是特定块,因此它不知道要复制它们,因此必须先复制它们,然后再将它们传递给它.

NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys:
                   //blows up after executing this
                   [^() { [AnotherClass staticMethod]; } copy], authURL,
                   [^() { NSLog(@"TODO");} copy], searchURL,
                   [^() { NSLog(@"TODO"); } copy], itemURL,
                   nil];
Run Code Online (Sandbox Code Playgroud)