6

所以,是的,我是这个疯狂的 iPhone 世界中的 Java 人。当谈到内存管理时,我仍然对自己在做什么不是很清楚。

我有一个使用导航控制器的应用程序,当该进入下一个视图时,我的代码如下所示:

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

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

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

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

这对我来说并不合适,但在运行 Instruments 时,它声称我没有任何内存泄漏。

所以我的问题是

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

2 回答 2

9

问题是(很可能)您在导航控制器有机会声明所有权之前释放了您的视图控制器。有两种方法可以解决这个问题:

  • -release将控制器推送到导航控制器
  • -autorelease你的控制器推动它之前。如果你这样做,活动的 NSAutoreleasePool (你不需要担心)会在稍后释放你的控制器。
于 2008-10-30T18:24:12.870 回答
3

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

[[[object alloc] init] autorelease];

@bpapa,

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

3)除非有明确的理由坚持该视图,否则您不应将其分配给实例变量。通常,您希望您的视图仅在您需要时才存在。

于 2008-10-30T21:29:35.320 回答