pushViewController是否保留了控制器?

时间:2010-08-24 17:30:21

标签: iphone objective-c cocoa-touch

我很难找出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];

非常感谢

加里

4 个答案:

答案 0 :(得分:11)

这没什么用......

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

你正在自动释放pushViewController的返回值:animated:,这是无效的。

您的第一个代码段有效且正确无误。 pushViewController:确实保留了被推送的控制器。

编辑:在您更新的代码中,两个样本之间几乎没有差异。两者都保持适当的保留计数但是,除非必要,否则避免使用autoRelease是一种“最佳做法”(特别是在内存敏感区域,如iPhone)。这有助于您的应用程序维持更可预测和可管理的内存占用。

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

确实如此。无论何时将一个对象提供给另一个这样的SDK对象,它都会被保留。虽然第二行不是自动释放你的想法。通常,为了清楚起见,您希望autoreleaseinit位于同一行。

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

答案 3 :(得分:0)

如果想尝试,你应该试试这个

id temp = [self.navigationController.viewControllers objectAtIndex:1];
[self.navigationController popToViewController:temp animated:YES];

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