Ошибка получения с NSXMLParser: [Parser conformsToProtocol:]: сообщение отправлено освобожденному экземпляру 0xcd6be20 - PullRequest
3 голосов
/ 01 января 2011

Я получаю эту ошибку от NSXMLParser, когда открываю контроллер представления NSXMLParser, а затем возвращаюсь к нему позже. 2010-12-31 21:49:32.306 App Name[12716:207] *** -[Parser conformsToProtocol:]: message sent to deallocated instance 0xcd6be20 :

Вот мой код: https://gist.github.com/761366

Ответы [ 2 ]

3 голосов
/ 01 января 2011

Невозможно сказать из предоставленного вами фрагмента, что именно происходит, но эта ошибка, как правило, означает, что вы перевыпустили объект, о котором сообщается.Мое прочтение вашего описания и вашего кода таково: синтаксический анализатор работает дольше, чем объект, который вы устанавливаете в качестве своего делегата здесь:

- (void)parseXMLFileAtURL:(NSString *)URL
{   
    stories = [[NSMutableArray alloc] init];
    NSURL *xmlURL = [NSURL URLWithString:URL];
    parser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];
    [parser setDelegate:self];
    [parser setShouldProcessNamespaces:NO];
    [parser setShouldReportNamespacePrefixes:NO];
    [parser setShouldResolveExternalEntities:NO];
    [parser parse];

}

Невозможно определить из размещенного вами фрагмента, какова область действияпеременный парсер есть.Я подозреваю, что это глобальная переменная или иным образом дольше, чем делегат.Я подозреваю это, потому что я вижу, что вы устанавливаете 'self object' как делегата, но никогда не отменяете его, и тот факт, что ошибочное сообщение conformsToProtocol: указывает на то, что это может быть проблемой, потому что NSXMLParser, несомненно, вызоветчто, прежде чем пытаться вызвать какие-либо методы делегата.Когда этот объект исчезает, он должен отказаться от своей роли делегата экземпляра NSXMLParser, вызвав:

[parser setDelegate: nil];

Если синтаксический анализатор на самом деле является глобальным или иным образом совместно используемым, то вам также следуетбудьте осторожны при воссоздании его при каждом вызове parseXMLFileAtURL: без освобождения предыдущих значений.Если это iVar для самого объекта, вам все равно нужно быть уверенным и очистить делегат, а затем освободить и очистить iVar, когда ваш объект исчезнет (т.е. в dealloc).

Но опять же, невозможно быть уверенным, основываясь на опубликованном вами фрагменте.

0 голосов
/ 01 января 2011

Это сообщение вы получите, когда отпускаете объект слишком много раз. Я вижу, что у вас есть настроенный пул автоматического выпуска, который может быть виновником, но вы, вероятно, получили это, так как вы запускаете несколько потоков. Похоже, что ваш tableViewController имеет переменную экземпляра с именем parser, если вы объявили это как свойство, вы можете проверить, что оно установлено для сохранения. Не видя полное объявление и реализацию заголовка, сложно сказать, где именно происходит выпуск.

Способ, которым я обычно обрабатываю эти ошибки, состоит в том, чтобы включить отслеживание NSZombie в XCode. Это даст вам трассировку стека при обращении к освобожденному объекту и позволит вам посмотреть на состояние вашего приложения в отладчике xcode.

Вот ссылка с инструкциями по настройке Xcode для включения NSZombies. http://www.cocoadev.com/index.pl?NSZombieEnabled

...