2012-02-09 6 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

파서 위임이 너무 일찍 릴리스되지 않도록하십시오. 파서는 델리게이트에 대한 약한 참조만을 보유 할 것이고, 파싱이 완료되기 전에 델리게이트가 dealloc 될 경우 파서가 델리게이트 메소드라고 부르려고 할 때 잘못된 액세스를 얻게됩니다.

+0

[parser release]를 블록에 넣으면 모든 것이 정상입니다. – Voloda2

0

사실 [parser parse] 이전에 [parser release]가 발생했습니다. 블록을 큐로 보내면 (블록이 실행 대기 상태가됩니다), [파서 릴리스]가 즉시 호출됩니다. dispatch_async를 사용할 때 블록 실행 지연이 있음을 명심하십시오.

이렇게하면 [파서 릴리스]를 블록에 넣으면 모든 것이 잘된다는 이유도 알 수 있습니다.

관련 문제