委托模式和UIKit视图控制器,-viewDidUnload怎么样?

时间:2011-05-24 07:48:35

标签: iphone objective-c memory delegates design-patterns

我是编程新手,我开始学习ObjC和CocoaTouch框架。 我已经了解了委托模式,我很习惯使用它,但也许我使用它太多了。

我有一件事情我不明白而且它是特定于UIKit视图控制器的,我已经阅读了很多关于它的帖子但是我找不到明确的答案。
Memory management with delegates?
Why are Objective-C delegates usually given the property assign instead of retain?
 让我们假设我有一个导航控制器,我正在通过它推动视图控制器,想象可见控制器作为委托(指定不保留)堆栈中的不可见控制器。内存警告传入,所有视图控制器(可见的除外)都使用viewDidUnload和dealloc方法卸载,代理将被卸载并且“回调”从未发送。
如果未按下新视图控制器但以模态方式呈现委托与视图控制器之间的“连接”永远不会丢失,则永远不会在父视图中调用viewDidUnload。

这是我的问题:
在两个视图控制器之间使用委托模式是否正确?

2 个答案:

答案 0 :(得分:2)

这肯定是一个正确的设计,取决于您的控制器语义。当“主”视图控制器从“从”视图控制器管理(和接收委托调用)时,我使用了这个。

至于您对发送内存警告时发生的情况的分析,可能存在一些误解,因为视图控制器实际上接收到viewDidUnload,但这意味着{{1}由它控制已被卸载以取回一些内存,因此控制器可以完成其部分清理(像往常一样)。视图控制器本身不会“卸载”或释放或者其他任何东西。因此将始终发送回调。唯一的问题是,如果先前已卸载视图,则需要将其恢复。

请记住,如果您完全无法重新创建已卸载的视图,则可以阻止在{{1}中不调用 view来释放特定视图覆盖。不过,请接受这个建议“暨granum salis”!

最后,无需使用模态视图。

确实,这就是Apple Docs所说的:

  
      
  • (void)didReceiveMemoryWarning:   此方法的默认实现检查视图控制器是否可以安全地释放其视图。如果视图本身没有超级视图,并且可以从nib文件或使用自定义loadView方法重新加载,则可以执行此操作。如果可以释放视图,则此方法将释放它并调用viewDidUnload方法。

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

  •   

答案 1 :(得分:0)

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