如果我使用dispatch_async,我的应用程序崩溃了

时间:2012-02-09 12:59:55

标签: ios crash grand-central-dispatch

此代码可以正常使用。

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];

2 个答案:

答案 0 :(得分:1)

确保解析器委托未过早发布。解析器只保存对委托的弱引用,如果在解析完成之前解析了委托,则当解析器尝试调用委托方法时,您将获得错误的访问权。

答案 1 :(得分:0)

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

这也解释了为什么当你将[解析器释放]放入块中时,一切都会变好。