iPhone: вызов dealloc для parentViewController вызывает исключение - PullRequest
1 голос
/ 03 марта 2010

Я имею дело с методами viewDidUnload и dealloc и обнаружил проблему при вызове [super dealloc]; в родительском контроллере представления.

У меня есть много контроллеров представления с пользовательским кодом, который я поместил снаружи в родительский контроллер представления. Итак, при определении моих контроллеров представления я установил ссылку на суперкласс:

@interface LoginViewController : AbstractViewController

Затем в методе dealloc я вызываю метод dealloc AbstractViewController:

//(Login View Controller code)
- (void)dealloc {
    [user release];
    [passwd release];
    [super dealloc];
}

[super dealloc] выполнить следующий код:

//(Abstract View Controller code)
- (void)dealloc {
    [dbUtils release];
    [loadingView release];
    [super dealloc];
}

Если я симулирую предупреждение о памяти на iPhone Simulator, выдается следующее исключение:

2010-03-03 11:27:45.805 MyApp[71563:40b] Received simulated memory warning.
2010-03-03 11:27:45.808 MyApp[71563:40b] *** -[LoginViewController isViewLoaded]:     message sent to deallocated instance 0x13b51b0
kill
quit

Однако, если я прокомментирую строку [super dealloc] в AbstractViewController, исключение не будет выдано, и мое приложение все еще будет работать.

Еще раз спасибо за вашу помощь!

Ответы [ 3 ]

2 голосов
/ 03 марта 2010

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

[myLoginViewController release]; //!< Triggers the dealloc call
myLoginController = nil; //!< Makes sure we never use it again

или, если myLoginViewController является свойством, вы можете сделать это более аккуратно:

self.myLoginViewController = nil;

Надеюсь, что поможет,

Сэм

1 голос
/ 02 сентября 2010

Обратите внимание: -didReceiveMemoryWarning не запускает -dealloc, а запускает -viewDidUnload. Так что я полагаю, что ваша реализация -viewDidUnload делает что-то неправильно, что приводит к освобождению окончательного удержания контроллера, так что вызывается -dealloc. Я только что столкнулся с этой проблемой в своем коде, которая вызвана перезаписью сохранения, выпущенной в -viewDidUnload.

0 голосов
/ 04 января 2013

Это случилось со мной и потребовалось время, чтобы выяснить. Один из делегатов пытался отправить сообщение, потому что делегат был сам, и это была сильная ссылка. когда я сделал это слабым, это, кажется, исправило это.

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