问题 pushViewController是否保留了控制器?


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

非常感激

加里


959
2017-08-24 17:30


起源

我用了 release 因为你知道你已经完成了 colorController 和 UINavigationController#pushViewController:animated 保留 colorController。但, autorelease 也有效。 - ma11hew28


答案:


这什么都不做......

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

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

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

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


11
2017-08-24 17:38



谢谢你,再次抱歉让自动释放错误。就是我追求的目标。 - fuzzygoat
错别字发生了,只是想确保它不是故意的!哈哈。 - Jerry Jones
优选自动释放以避免编码错误也是最佳做法。你选择哪个?好吧,如果Instruments告诉你autorelease占用了大量的CPU或内存,那么确保你可以使用显式释放调用。但这不太可能。 - Mike Weller


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

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


4
2017-08-24 17:42



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


确实如此。无论何时将一个对象提供给另一个这样的SDK对象,它都会被保留。虽然第二行不是自动释放你的想法。通常你想要的 autorelease 与...在同一条线上 init 为了清楚起见。

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

0
2017-08-24 17:39





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

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

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


0
2018-06-30 05:57