2012-02-09 73 views
0

此代码工作正常。我的应用程序崩溃,如果我使用dispatch_async

parser = [[NSXMLParser alloc] initWithData:data]; 
parser.delegate = self; 
[parser parse]; 
[parser release]; 

但是,如果我使用dispatch_async,我会得到EXC_BAD_ACCESS。但为什么?

parser = [[NSXMLParser alloc] initWithData:data]; 
parser.delegate = self; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^
       { 
       [parser parse]; 
       }); 
[parser release]; 

回答

1

确保解析器委托不会被过早释放。解析器只保存对委托的弱引用,并且如果委托在解析完成之前解除分配,那么当解析器试图调用它的委托方法时,您将得到错误的访问权限。

+0

我把[parser release]放在块中,现在一切正常。 – Voloda2 2012-02-09 14:29:57

0

其实原因是[parser release]发生在[parser parse]之前。一旦将块分派到队列中(该块将在那里等待执行),将立即调用[解析器释放]。请记住,使用dispatch_async时,该块有执行延迟。

这也解释了为什么当你把[解析器发布]放在块中,一切都很好。

相关问题