pushViewController方法会保留控制器吗?

11

我正在努力找出pushViewController是否会保留控制器,目前我有以下代码(可以工作)...

ColorController *colorController = [[ColorController alloc] initWithNibName:nibColor bundle:nil];
[[self navigationController] pushViewController:colorController animated:YES];
[colorController release];

但我正在考虑删除发布并添加自动释放...

ColorController *colorController = [[[ColorController alloc] initWithNibName:nibColor bundle:nil] autorelease];
[[self navigationController] pushViewController:colorController animated:YES];
非常感谢Gary。

我会使用 release,因为你已经完成了 colorControllerUINavigationController#pushViewController:animated 会保留 colorController。但是,autorelease 也可以。 - ma11hew28
4个回答

11

这段代码什么也不做...

ColorController *colorController = [[ColorController alloc] initWithNibName:nibColor bundle:nil];
[[[self navigationController] pushViewController:colorController animated:YES] autorelease];
你正在自动释放 pushViewController:animated: 的返回值,该返回值为 void。
您的第一个片段是有效且正确的。pushViewController:确实会保留被推入的控制器。
编辑:在您更新的代码中,两个示例之间几乎没有区别。两者都维护了适当的保留计数。但是,在必要时(特别是在像iPhone这样的内存敏感区域),避免使用autoRelease是一种“最佳实践”。这有助于您的应用程序维护更可预测和可管理的内存占用。

谢谢,再次抱歉将autorelease放在错误的行上。正是我想要的。 - fuzzygoat
笔误是常有的事情,只是想确认一下这不是故意的!哈哈。 - Jerry Jones
使用autorelease是避免编码错误的最佳实践。你会选择哪个呢?如果Instruments告诉你autorelease占用了大量CPU或内存,那么你可以使用显式的release调用。但这种情况非常不可能发生。 - Mike Weller

4

是的,视图控制器被保留。

你发布的两个代码块并没有太大区别(至少我看到的版本没有问题 -- 其他人可能看到了一个调用autorelease错误的早期版本)。你可以使用任意一个。这只是一种风格问题。


谢谢你,Shaggy Frog,非常感激。 - fuzzygoat

0
如果想尝试,你应该试试这个。
id temp = [self.navigationController.viewControllers objectAtIndex:1];
[self.navigationController popToViewController:temp animated:YES];

您将被导航到堆栈中可用的任何其他先前的 ViewController。


0

确实是这样的。每当您将一个对象传递给另一个SDK对象时,它将被保留。尽管第二行并没有自动释放您认为的内容。通常,出于清晰起见,您希望在同一行上使用autoreleaseinit

ColorController *colorController = [[[ColorController alloc] initWithNibName:nibColor bundle:nil] autorelease];
[[self navigationController] pushViewController:colorController animated:YES];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接