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

Удостоверьтесь, что делегат парсера не выпускается преждевременно. Парсер будет содержать только слабую ссылку на делегата, и если делегат будет отменен до того, как синтаксический анализ завершится, вы получите плохой доступ, когда парсер попытается вызвать его методы делегирования.

+0

Я помещаю [парсерный релиз] в блок, и теперь все в порядке. – Voloda2

0

На самом деле причиной было [разбор парсера] до [parser parse]. Однажды после отправки блока в очередь (блок будет там, ожидающий выполнения), немедленно будет вызываться [парсерная версия]. Имейте в виду, что при использовании dispatch_async существует задержка выполнения для блока.

Это также объясняет, почему, когда вы кладете [парсерный релиз] в блок, и все становится хорошо.

Смежные вопросы