不使用时释放UIViewController

时间:2011-02-25 17:59:51

标签: iphone uiviewcontroller uinavigationcontroller release

嗨,我希望有人可以帮我解决这个问题。

我有一个名为“Login”的UIViewController(例如),当用户成功登录时,将调用另一个控制器来替换“Login”控制器,如下所示:

[self presentModalViewController:anotherController animated:YES]. 

我不再需要以前的控制器了,所以我放置了[self release],如下面的代码片段所示。

LoginController.m

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

这将调用LoginController的dealloc方法,我可以肯定它已经发布了。

现在在视图中的新控制器中有一个调用UINavigationController的按钮,如下所示:

[self presentModalViewController:settingsNavigationController animated:YES];

但是如果我没有发布以前的LoginController,这会导致应用程序崩溃。

可能有一种更简单或更合乎逻辑的方法来释放控制器,但由于我的想法不足,我有时会采取严厉的措施。

谢谢。

3 个答案:

答案 0 :(得分:3)

你不应该发布LoginController,至少不要发布它自己的-viewDidDisappear:。该控制器仍在使用中,可以通过导航控制器的parentViewController属性进行引用。当控制器不再是视图控制器层次结构的一部分时,释放控制器,而不仅仅是当控制器不再可见时。

此外,[self release]表示您正在应用错误的内存管理。

答案 1 :(得分:2)

1)更换“登录”控制器

presentModalViewController不会替换您的登录视图控制器,但会将另一个控制器放在您的登录视图控制器之上。

2)viewDidDisappear

你应该阅读文档。引用 - 您可以覆盖此方法以执行与解除或隐藏视图相关的其他任务。如果重写此方法,则必须在实现中的某个时刻调用super。

换句话说,您也必须致电[super viewDidDisappear:animated]

3)内存管理

您绝对需要阅读内存管理指南 - http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/MemoryMgmt/MemoryMgmt.html

4)查看控制器

您也一定要阅读View Controller Programming Guide - http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html

答案 2 :(得分:1)

你正在做的两件事。

首先,viewDidDisappear不是析构函数。不要在那里释放自己。 viewDidDisAppear和shows用于视图的可见性,而不是内存中的内容。

其次,presentModalViewController用于呈现MODAL视图控制器,即child。

您应该考虑设置UINavigationController并调用

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

在某些情况下,您也可以使用现有模式使用[autorelease]视图控制器。