Освобождение UIViewController, когда он не используется

Привет, я надеюсь, что кто-нибудь может помочь мне с этой проблемой.

У меня есть UIViewController с именем «Login» (например), и когда пользователь успешно вошел в систему, он вызовет другой контроллер для замены контроллера «Login», как показано ниже:

[self presentModalViewController:anotherController animated:YES]. 

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

LoginController.m

- (void)viewDidDisappear:(BOOL)animated {
    [self release];
}

Затем это вызовет метод dealloc LoginController, и я могу быть уверен, что он выпущен.

Теперь в новом контроллере, который теперь находится в поле зрения, есть кнопка, которая вызывает UINavigationController, как показано ниже:

[self presentModalViewController:settingsNavigationController animated:YES];

Но это приводит к сбою приложения, которое обычно работало бы, если бы я не выпустил предыдущий LoginController.

Вероятно, есть более простой или более логичный способ освободить контроллер, но поскольку у меня заканчиваются идеи, я иногда прибегаю к радикальным мерам.

Спасибо.


person Ufb007    schedule 25.02.2011    source источник


Ответы (3)


Вы не должны выпускать LoginController, по крайней мере, не самостоятельно -viewDidDisappear:. Этот контроллер все еще используется, и на него можно ссылаться, например, с помощью свойства parentViewController контроллера навигации. Отпустите контроллер, когда он больше не является частью вашей иерархии контроллеров представления, а не только тогда, когда он больше не виден.

Кроме того, [self release] является предупреждающим знаком о том, что вы применяете неправильное управление памятью.

person Jonah    schedule 25.02.2011

1) Заменить контроллер "Логин"

presentModalViewController не заменяет ваш контроллер представления входа в систему, но помещает другой контроллер поверх вашего контроллера представления входа.

2) viewDidDisappear

Вам следует прочитать документацию. Цитата - вы можете переопределить этот метод для выполнения дополнительных задач, связанных с закрытием или скрытием представления. Если вы переопределите этот метод, вы должны вызвать super в какой-то момент своей реализации.

Другими словами, вы тоже должны позвонить [super viewDidDisappear:animated].

3) Управление памятью

Вам обязательно нужно прочитать Руководство по управлению памятью - http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/MemoryMgmt/MemoryMgmt.html

4) Контроллер просмотра

Вам обязательно нужно прочитать Руководство по программированию контроллера View - http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html

person zrzka    schedule 25.02.2011

Две проблемы с тем, что вы делаете.

Во-первых, viewDidDisappear НЕ является деструктором. Не отпускай себя там. viewDidDisAppear и появляться используются для видимости представления, а не в / вне памяти.

Во-вторых, presentModalViewController предназначен для представления MODAL-контроллера представления, то есть дочернего элемента.

Вам следует подумать о настройке UINavigationController и вызвать

[navigationController popToRootViewControllerAnimated:FALSE];   
[navigationController pushViewController:(UIViewController*)controller animated:TRUE];      

также в некоторых ситуациях вы можете обойтись контроллером представления [autorelease] с использованием текущего модального окна.

person Tyler Zale    schedule 25.02.2011