嗨,我希望有人可以帮我解决这个问题。
我有一个名为“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,这会导致应用程序崩溃。
可能有一种更简单或更合乎逻辑的方法来释放控制器,但由于我的想法不足,我有时会采取严厉的措施。
谢谢。
答案 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]视图控制器。