Программирование на iOS: приложение super dealloc вылетает - PullRequest
2 голосов
/ 05 июля 2011

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

В моем приложении для iPad я вызываю новый UIViewController из rootView:

DisplayTheMapViewController_iPad *root = [[DisplayTheMapViewController_iPad alloc] init];
displayTheMapViewController=root;
[[self navigationController] pushViewController:displayTheMapViewController animated:YES];
[root release];

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

когда я комментирую [root release], приложение остается живым, но тогда у меня возникает другая проблема: во время моего второго посещения представления (не первого!) При вызове метода, который помещает всплывающее окно в представление, приложение падает, и я получаю следующую ошибку:

'Поповеры не могут быть представлены из вида, у которого нет окна.'

Я должен сделать что-то не так. Заранее благодарю за любой совет.

Ответы [ 3 ]

1 голос
/ 05 июля 2011

Эта строка немного озадачивает:

displayTheMapViewController=root;

Я предполагаю, что displayTheMapViewController является переменной экземпляра?Если это так, вы назначаете ему root, но не сохраняете root.Когда этот контроллер извлекается из стека навигации, контроллер навигации освобождает его, что приводит к его освобождению, потому что ничто другое не сохранило его.displayTheMapViewController будет указывать на недопустимый объект.Возможно, вы хотели сказать:

self.displayTheMapViewController=root;

Если свойство displayTheMapViewController настроено на сохранение его содержимого, это предотвратит проблему с висящим указателем выше.

0 голосов
/ 05 июля 2011

Вы не публикуете достаточно кода для полной диагностики проблемы, но я бы посоветовал проверить строку: displayTheMapViewController = root;.Поскольку вы не сохраняете root, displayTheMapViewController останется зависшим после того, как контроллер представления удален из контроллера навигации.

Что касается того, что происходит, когда вы не освобождаете root и повторно входите в представление, я подозреваю,это что-то связанное с внутренностями DisplayTheMapViewController_iPad, когда у вас есть второй экземпляр этого.

0 голосов
/ 05 июля 2011

Проверьте верхний конец класса DisplayTheMapViewController_iPad, что вы забыли освободить выделенный объект.

...