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

问题描述

| 我刚开始编程,所以我开始学习ObjC和CocoaTouch Framework。 我已经了解了委托模式,使用它很舒服,但是也许我使用了太多。 我不了解一件事,它特定于UIKit视图控制器,我已经阅读了很多有关它的文章,但找不到清晰的答案。 用委托进行内存管理? 为什么通常给Objective-C代表赋予属性而不是保留?  让我们假设我有一个导航控制器,并且正在推动视图控制器通过它,想象一下可见控制器在堆栈中有一个非可见控制器作为委托(分配(不保留))。出现内存警告,并且使用viewDidUnload和dealloc方法卸载了所有视图控制器(可见控制器除外),该代理将被卸载,并且永远不会发送\“ callback \”。 如果新的视图控制器没有被推送,而是以模态形式呈现,则代表和视图控制器之间的“连接”永远不会丢失,因此在父视图中永远不会调用viewDidUnload。 这是我的问题: 在两个视图控制器之间使用委托模式是否正确?     

解决方法

当然,这是正确的设计,具体取决于您的控制器语义。我在让\“ master \”视图控制器从\“ slave \”视图控制器管理(并接收委托调用)时使用了此功能。 关于发送内存警告时发生的情况的分析,可能会有一点误解,因为视图控制器实际上收到了“ 0”,但这意味着它所控制的“ 1”已被卸载以取回一些信息。内存,因此控制器可以执行其部分清洁工作(与往常一样)。视图控制器本身不是“已卸载”或已释放或任何其他形式。因此,回调将始终被发送。唯一的事情是,如果先前已卸载视图,则需要将其还原。 还要记住,如果完全不可能重新创建已卸载的视图,则可以通过不调用
didReceiveMemoryWarning
替代中的ѭ2prevent来防止特定视图被释放。采取这个建议“暨颗粒水泡”,但是! 最后,无需使用模式视图。 确实,这就是Apple Docs所说的:      (void)didReceiveMemoryWarning:   此方法的默认实现检查视图控制器是否可以安全地释放其视图。如果视图本身没有超级视图,并且可以从nib文件或使用自定义loadView方法重新加载视图,则可以这样做。如果可以释放视图,则此方法将释放它并调用viewDidUnload方法。   (void)viewDidUnload:   将此方法称为viewDidLoad方法的对应方法。当视图控制器需要释放其视图以及与该视图关联的任何对象以释放内存时,在内存不足的情况下调用它。由于视图控制器通常存储对视图和其他与视图相关的对象的引用,因此应使用此方法放弃这些对象的所有权,以便可以回收它们的内存。您应该只对以后可以轻松重新创建的对象(在viewDidLoad方法中或在应用程序的其他部分中)进行此操作。您不应使用此方法来释放用户数据或任何其他不易重新创建的信息。        ,您的UIViewController非常轻巧,切勿在内存不足的情况下将其卸载。视图控制器拥有的UIView非常重,并且在内存不足的情况下肯定会卸载。如有必要,您的控制器应准备好重新创建视图,但是您将不需要重新生成视图控制器堆栈。