我很难找出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];
非常感谢
加里
答案 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对象,它都会被保留。虽然第二行不是自动释放你的想法。通常,为了清楚起见,您希望autorelease
与init
位于同一行。
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。