答案here都说pushViewController保留了给定的viewController,但它们没有引用说明这一点的文档。
问题是他们怎么知道pushViewController会保留给定的视图控制器?我们可以假设所有其他带有NSObject *派生对象指针的类都遵守这个约定吗?
我需要比目前提出的答案提出更强有力的论据/证据。例如,关于UIView::addSubview的文档清楚地说明了“接收者保留了这个视图”。或者,如果您打算通过暗示显示接收到的控制器,因为UINavigationController具有与集合类相同的语义,那么通过显示它在内部使用其中一个集合类或引用一些指出的文档来显示它确实存在这个。 pushViewController的文档说给定的视图控制器放在“导航堆栈”上,但它没有说明这个堆栈是什么类。实际上,查看UINavigationController的头文件中的定义,看起来它不是使用堆栈,而是使用NSMutableArray。如果你已经完成了数学学位和书面证明,那么你就会理解我正在寻找的那种严谨的知识分子。
答案 0 :(得分:7)
因为收藏品总是拥有自己的物品,,父母总是拥有自己的孩子。
从某种意义上说,导航控制器就像一种集合 - 堆栈一样运作。
如果控制器在导航控制器上启动并消失 - 这将是一个大问题。
将对象添加到集合时 (例如数组,字典或 集合),集合取得所有权 它的。该系列将放弃 删除对象时的所有权 从收集或当 集合本身已经发布。
答案 1 :(得分:0)
你应该试试这个
id temp = [self.navigationController.viewControllers objectAtIndex:1];
[self.navigationController popToViewController:temp animated:YES];
您将被导航到堆栈中可用的任何其他先前的ViewController。
答案 2 :(得分:0)
Apple的文档从未是最严格的。你对[NSString stringWithString:nil]
有什么看法? [NSArray arrayWithArray:nil]
? [NSURL URLWithString:nil]
?
(答案:一个异常,一个空数组,一个异常或零,具体取决于操作系统版本。)
在一天结束时,文档所说的并不重要。 Objective-C主要是关于约定的,如果你理解了约定,你通常会把它做对。如果文档没有提到边缘情况并且你没有测试,或文档错误(iPhone 3G上的AVCapture不支持420v)或者苹果改变边缘情况会发生什么(使用上面的NSURL,它会出错)意味着较旧的操作系统版本在较新的版本很好的情况下崩溃,或者有人引入了一个错误(例如,在4.1 / 3GS上挂起了640x480 420v的AVCapture,但只有当你设置它时 - 420v是默认值,并且如果你不碰它就行了!)。
当它出错时,指着文档就不会救你。即使这不是你的错,它仍然是你的问题:你的应用程序崩溃,你欠你的用户修复它(除非Apple阻止你这样做,这也会发生)。
测试节拍文档。
答案 3 :(得分:0)
通过显示它在内部使用其中一个集合类或引用一些说明这一点的文档来显示它。
来自the View Controller Programming Guide:
导航堆栈是由导航控制器管理的自定义视图控制器对象的后进先出集合。