如何用导航控制器管理UIViewControllers?

时间:2008-10-30 17:51:36

标签: iphone cocoa-touch memory-management

所以是的,我是这个疯狂iPhone世界中的Java家伙。在内存管理方面,我对我正在做的事情并不十分了解。

我有一个使用导航控制器的应用程序,当需要进入下一个视图时,我的代码看起来像这样:

UIViewController *myController = [[MyViewController alloc] initWithNibName:@"MyView" 
                                                                    bundle:[NSBundle mainBundle];
[[self navigationController] pushViewController:myController animated:YES];

现在根据Apple关于内存管理的基本规则

  

如果使用名称以“alloc”或“new”开头或包含“copy”的方法创建对象,则获得对象的所有权(例如,allocnewObject或{ {1}}),或者如果您发送mutableCopy消息。您有责任使用retainrelease放弃您拥有的对象的所有权。在收到对象的任何其他时间,您都不能释放它。

对我来说,这意味着我应该发布autorelease,或者给它一个myController消息。但是,每当我尝试这样做时,我的应用程序会因为我从堆栈中推送和弹出视图而崩溃。

这对我来说没有味道,但在运行仪器时它声称我没有任何内存泄漏。

所以我的问题是

  1. 我这样做了吗?
  2. 导航控制器是否拥有MyViewController的所有权,解释了内存泄漏的缺失?
  3. 我应该将myController分配给我的根ViewController中的实例变量吗?在那种情况下,它将标记为retain,我将在root的dealloc方法中释放

2 个答案:

答案 0 :(得分:9)

问题是(最有可能)你在导航控制器有机会声明所有权之前释放你的viewController 。有两种方法:

  • -release您的控制器 将其推送到导航控制器
  • 之后
  • -autorelease您的控制器推送之前。如果你这样做,活跃的NSAutoreleasePool(你不需要担心)将在以后释放你的控制器。

答案 1 :(得分:3)

@Ben Gottlieb为什么你需要在推送前自动发布?在对象分配时保留计数为1,在推送之前或之后自动释放不影响保留计数,尽管通常自动释放作为样式的问题在对象alloc / init之后应用:

[[[object alloc] init] autorelease];

@bpapa,

2)按下时,导航控制器将保留视图控制器。稍后当导航控制器堆栈弹出此视图时,导航控制器将释放它。

3)除非有明确的理由保留该视图否则不应将其分配给实例变量。通常,只要您需要它们,您就希望您的视图存在。