此代码可以正常使用。
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];
答案 0 :(得分:1)
确保解析器委托未过早发布。解析器只保存对委托的弱引用,如果在解析完成之前解析了委托,则当解析器尝试调用委托方法时,您将获得错误的访问权。
答案 1 :(得分:0)
实际上原因是[解析器发布]发生在[解析器解析]之前。一旦将块分派到队列中(块将在那里等待执行),将立即调用[parser release]。请记住,使用dispatch_async时块的执行延迟。
这也解释了为什么当你将[解析器释放]放入块中时,一切都会变好。