UIViewController извлекается из стека представлений, и NSURLConnection завершает работу приложения. - PullRequest
3 голосов
/ 23 мая 2010

Я нажимаю UIViewController на UINavigationController. Этот контроллер представления немедленно начинает загрузку XML-канала, а затем анализирует его. Однако, если вы нажмете кнопку «Назад» до того, как загрузка будет завершена, произойдет сбой EXC_BAD_ACCESS. Строка, которая дает сбой, находится в parserDidEndDocument, и это строка:

if (self.delegate && [self.delegate conformsToProtocol:@protocol(ModelDelegate)]) [self.delegate modelDidFinishParsing:self];

Я предполагаю, что происходит сбой, потому что он пытается получить доступ к self.delegate, который больше не назначен. Как мне обойти это?

Кроме того, я бы выпустил объект модели в методе modelDidFinishParsing. Как бы я выпустил эту модель, если она никогда не достигнет этого метода.

Ответы [ 2 ]

1 голос
/ 24 мая 2010

Я настраиваю объекты для обработки своих загрузок (и других асинхронных или долго выполняющихся задач) в AppDelegate, затем запускаю их по мере необходимости от различных контроллеров. Таким образом, они принадлежат и имеют постоянство в течение всего срока действия приложения.

Лучший способ сделать это - передать их в viewController, который будет нуждаться в них (а не в viewController, «ожидающий» того, что appDelegate будет иметь тот или иной объект, готовый и ожидающий) - внедрение зависимости.

Эти объекты каким-то образом обновляют мою модель, когда заканчивают работу, и, если мне нужно, я использую NSNotifications, чтобы объявить о завершении. Это изолирует меня от беспорядка, который я использовал, пытаясь отменить или поменять местами делегаты в viewWillDisappear и т. Д., Чтобы избежать проблем, с которыми вы сталкиваетесь.

0 голосов
/ 19 октября 2011

Причина, по которой ваше приложение дает сбой, вероятно, в том, что NSURLConnection сохраняет свой делегат (поэтому он может вызывать его надежно), но объекты, на которые у этого делегата есть слабые ссылки, были освобождены.то, на что указывает self.delegate, возможно, было освобождено, когда контроллер представления активирован, но свойство делегата не было очищено (установлено значение nil).

Решение вашей проблемы - очистить (nil) self.delegateв соответствующее время, когда подкласс UIViewController выталкивается из стека навигации.

Примечание: сохранение делегатов - не обычное поведение для классов Какао.В ситуациях, когда это происходит вопреки стандартной практике, это задокументировано (см. Документы NSURLConnection).

...