2012-02-09 76 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時,該塊有執行延遲。

這也解釋了爲什麼當你把[解析器發佈]放在塊中,一切都很好。

相關問題