2011-02-25 86 views
1

嗨,希望有人能帮我解决这个问题。在不使用时释放UIViewController

我有一个名为UIViewController的“登录”(例如),当用户成功登录,这将调用另一个控制器来替代“登录”控制器象下面这样:

[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

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

此外[self release]是您正在应用不正确的内存管理的警告标志。

1

两个问题与你在做什么。

首先,viewDidDisappear不是析构函数。不要在那里释放自我。 viewDidDisAppear并显示用于视图的可见性,而不是内存中/内存不足。

二,presentModalViewController用于呈现MODAL视图控制器,即子视图。

你应该考虑建立一个UINavigationController,并呼吁

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

也是在某些情况下,你可以摆脱目前使用的模态[自动释放]视图控制器。

2

1)更换“登录”控制器

presentModalViewController不替换您的登录视图控制器,但是却让anotherController上的登录视图控制器的顶部。

2)viewDidDisappear

您应该阅读文档。引用 - 您可以重写此方法以执行与关闭或隐藏视图相关的其他任务。如果您重写此方法,则必须在实现中的某个时刻调用super。您也可以致电[super viewDidDisappear:animated]

3)内存管理

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

4) - 视图 - 控制器

你一定要需要阅读视图控制器编程指南太 - http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html

相关问题