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

bpa*_*apa 6 iphone cocoa-touch memory-management

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

我有一个使用导航控制器的应用程序,当需要继续下一个视图时,我的代码如下所示:

UIViewController *myController = [[MyViewController alloc] initWithNibName:@"MyView" 
                                                                    bundle:[NSBundle mainBundle];
[[self navigationController] pushViewController:myController animated:YES];
Run Code Online (Sandbox Code Playgroud)

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

如果使用名称以"黄金"或"新",或包含"复制"的方法创建它,你需要一个对象的所有权(例如alloc,newObjectmutableCopy),或者如果你发送一个retain消息.您有责任放弃使用release或拥有的对象的所有权autorelease.在收到对象的任何其他时间,您不得释放它.

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

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

所以我的问题是

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

Ben*_*ieb 9

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

  • -release您的控制器,按向导航控制器
  • -autorelease你的控制器推动之前.如果您这样做,活动的NSAutoreleasePool(您不必担心)将在以后释放您的控制器.


dno*_*len 3

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

[[[object alloc] init] autorelease];
Run Code Online (Sandbox Code Playgroud)

@bpapa,

2)推送时,导航控制器将保留视图控制器。稍后,当该视图从导航控制器堆栈中弹出时,导航控制器将释放它。

3)除非有明确的理由保留该视图,否则您不应该将其分配给实例变量。一般来说,您希望您的视图仅在您需要时才存在。