Iphone 委托模式和UIKit视图控制器,那么-viewDidUnload呢?

Iphone 委托模式和UIKit视图控制器,那么-viewDidUnload呢?,iphone,objective-c,memory,delegates,design-patterns,Iphone,Objective C,Memory,Delegates,Design Patterns,我对编程相当陌生,我开始学习ObjC和CocoaTouch框架。 我已经了解了委托模式,我很习惯使用它,但可能我用得太多了 有一件事我不明白,这是特定于UIKit视图控制器的,我读了很多关于它的帖子,但我找不到明确的答案。 让我们假设我有一个导航控制器,我将视图控制器推过它,想象一下可见控制器在堆栈中有一个不可见的控制器作为委托(分配而不是保留)。内存警告传入,所有视图控制器(除了可见的)都使用viewDidUnload和dealloc方法卸载,代理将被卸载,“回调”将不会发送。 如果新的视

我对编程相当陌生,我开始学习ObjC和CocoaTouch框架。 我已经了解了委托模式,我很习惯使用它,但可能我用得太多了

有一件事我不明白,这是特定于UIKit视图控制器的,我读了很多关于它的帖子,但我找不到明确的答案。


让我们假设我有一个导航控制器,我将视图控制器推过它,想象一下可见控制器在堆栈中有一个不可见的控制器作为委托(分配而不是保留)。内存警告传入,所有视图控制器(除了可见的)都使用viewDidUnload和dealloc方法卸载,代理将被卸载,“回调”将不会发送。
如果新的视图控制器未被推送,而是以模式显示,则代理和视图控制器之间的“连接”永远不会丢失,在父视图中永远不会调用viewDidUnload

这是我的问题:

在两个视图控制器之间使用委派模式是否正确?

您的UIViewController相当轻量级,不应在内存不足的情况下卸载。视图控制器拥有的UIView非常重,肯定会在内存不足的情况下卸载。如果需要,您的控制器应该准备好重新创建视图,但您永远不需要重新生成视图控制器堆栈。

这当然是一种正确的设计,具体取决于控制器的语义。我在使用“主”视图控制器管理(并接收来自“从”视图控制器的委托调用)时使用了此选项

至于您对发送内存警告时会发生什么的分析,可能有一点误解,视图控制器实际上接收到了
viewDidUnload
,但这意味着它控制的
视图已被卸载以获取一些内存,因此,控制器可以像往常一样完成其部分清洁工作。视图控制器本身并不是“卸载”或释放的,或者其他什么。因此,将始终发送回调。唯一的问题是,如果以前卸载过视图,则需要恢复它

还请记住,如果完全无法重新创建已卸载的视图,则可以通过在
didReceiveMemoryWarning
覆盖中不调用
super
来防止特定视图被释放。然而,请接受这个建议“加盐格兰纳姆”(cum granum salis)

最后,无需使用模态视图

事实上,我们可以这样说:

  • (无效)未收到记忆警告: 此方法的默认实现检查视图控制器是否可以安全释放其视图。如果视图本身没有superview,并且可以从nib文件或使用自定义loadView方法重新加载,则这是可能的。如果可以释放视图,此方法将释放它并调用viewDidUnload方法

  • (无效)视图卸载: 此方法作为viewDidLoad方法的对应项调用。在内存不足的情况下,当视图控制器需要释放其视图以及与该视图关联的任何对象以释放内存时,会调用该函数。由于视图控制器通常存储对视图和其他视图相关对象的引用,因此应使用此方法放弃这些对象的所有权,以便回收这些对象的内存。您应该只对以后可以在viewDidLoad方法中或从应用程序的其他部分轻松重新创建的对象执行此操作。您不应使用此方法发布用户数据或任何其他无法轻松重新创建的信息


我懂了。。。终于明白了……终于有了一点曙光;-)删除的只是VC拥有的视图,而不是VC本身。非常感谢!!!!!也谢谢你,摩根两个声音比一个好:-)