2008-10-30 46 views
6

所以是的,我是一个在这个疯狂的iPhone世界中的Java人。当谈到记忆管理时,我对自己在做什么没有很好的想法。如何通过导航控制器管理UIViewControllers?

我有一个使用导航控制器,当它的时间去到下一个视图我有一些代码,看起来像这样的应用程序:

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

现在根据苹果的内存管理

基本规则

如果使用名称以“黄金”或“新”,或包含“复制”(例如,allocnewObject,或mutableCopy),或者如果您发送的方法创建你需要一个对象的所有权它是一个retain消息。您有责任放弃使用releaseautorelease所拥有的物品的所有权。任何其他时间你收到一个对象,你不能释放它。

对我来说,这意味着我应该释放myController,或给它一个autorelease消息。但是,每当我尝试这样做的时候,我的应用程序在我将视图从堆栈中弹出并弹出时就会崩溃。

这听起来没有什么味道,但在运行仪器时声称我没有任何内存泄漏。

所以我我的问题是

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

回答

3

@Ben Gottlieb你为什么需要在推送之前自动释放?在对象分配保留数为1,前或推不影响保留计数,但被应用AFER对象分配/初始化一般自动释放作为一个风格问题后自动释放:

[[[object alloc] init] autorelease]; 

@bpapa,

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

3)除非有明确的理由坚持该观点,否则不应将其分配给实例变量。一般而言,只要你需要他们,你就希望你的观点存在。

+0

我只是对比autorelease和release的使用。你可以在之前或之后自动释放,没关系,但是如果你释放,你必须在之后执行。 – 2008-11-26 19:53:31

9

问题是(最有可能)你释放你的viewController 之前导航控制器有机会要求所有权释放。这种情况有解决方法有两种:

  • -release控制器后推到导航控制器
  • -autorelease控制器前推。如果你这样做,活动的NSAutoreleasePool(你不需要担心)会在以后的时间里释放你的控制器。