Мое приложение зависло, если я использую dispatch_async - PullRequest
0 голосов
/ 09 февраля 2012

Этот код работает нормально.

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 ]

1 голос
/ 09 февраля 2012

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

0 голосов
/ 25 марта 2013

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...