Невозможно сказать из предоставленного вами фрагмента, что именно происходит, но эта ошибка, как правило, означает, что вы перевыпустили объект, о котором сообщается.Мое прочтение вашего описания и вашего кода таково: синтаксический анализатор работает дольше, чем объект, который вы устанавливаете в качестве своего делегата здесь:
- (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).
Но опять же, невозможно быть уверенным, основываясь на опубликованном вами фрагменте.