Выпуск UIViewController, когда он не используется - PullRequest
1 голос
/ 25 февраля 2011

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

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

[self presentModalViewController:anotherController animated:YES]. 

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

LoginController.m

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

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

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

[self presentModalViewController:settingsNavigationController animated:YES];

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

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

Спасибо.

Ответы [ 3 ]

3 голосов
/ 25 февраля 2011

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

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

2 голосов
/ 25 февраля 2011

1) Замените контроллер "Login"

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

2) viewDidDisappear

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

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

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

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

4) View Controller

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

1 голос
/ 25 февраля 2011

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

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

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

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

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

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

...