didReceiveMemoryWarning,viewDidUnload

时间:2013-08-22 11:14:35

标签: ios objective-c

我正在阅读一本书,该书建议将我的IBOutlets声明为weak时应该在我的应用程序获得内存不足警告时处理该问题。例如,我现在需要在viewDidUnload方法中将这些出口设置为nil。

我也听说iOS6 viewDidUnload已被弃用,而是调用了didReceiveMemoryWarning

无论如何,我该如何继续,我是否应该将IBOutlet声明为weak,并“忘记”实施didReceiveMemoryWarningsviewDidUnloads

4 个答案:

答案 0 :(得分:2)

并非所有IBOutlets都应该weak。来自Apple docs (Resource Programming guide)

的建议
  

Outlets通常应该很弱,除了从文件所有者到nib文件中的顶级对象(或者在iOS中,故事板场景中)应该很强的那些。因此,您创建的插座通常应该很弱,因为:

     
      
  • 您创建的出口,例如视图控制器视图或窗口控制器窗口的子视图,是不暗示所有权的对象之间的任意引用。

  •   
  • 强大的出口通常由框架类指定(例如,UIViewController的视图出口或NSWindowController的窗口出口)。

  •   

示例:

XIB中的顶级对象应声明为strong,其他任何子视图/控件都应设为weak属性。

    @property (nonatomic, weak)   IBOutlet MyView *viewContainerSubview;
    @property (nonatomic, strong) IBOutlet MyOtherClass *topLevelObj;

使用ARC weak生命周期限定符有其自身的优势(Refer Apple docs)因为,

  

__ weak指定不使引用对象保持活动状态的引用。当没有对该对象的强引用时,弱引用被设置为nil。

因此您无需担心设置IBOutlets nil,其生命周期会自动受其顶级实例的约束。

应该实现

didReceiveMemoryWarning以清除任何正在占用内存的可再生资源。当您收到didReceiveMemoryWarning调用时,它应该用于释放以前使用的非关键资源:自定义数据结构,用于填充UI的Web服务响应等。需要确定任何资源的非关键性由开发人员。

答案 1 :(得分:0)

建议使用IBOutlet作为弱点。当您将它们声明为强大时,如果内存不足,您可能需要处理以在viewDidUnload方法中清除它们。

然而,除了Outlets之外还有更多的对象,如果出现内存问题,也可以从内存中删除。因此,如果程序的出口较弱,您只需要考虑缓存的数据对象并注意其他内容。

答案 2 :(得分:0)

根据Apple的documentation

内存是iOS中的关键资源,视图控制器提供内置支持,可在关键时刻减少内存占用。 UIViewController类通过 didReceiveMemoryWarning 方法自动处理低内存条件,释放不需要的内存。

在iOS 6之前,当发生内存不足警告时,UIViewController类会清除其视图,如果它知道它可以重新加载或稍后再次重新创建它们。如果发生这种情况,它还会调用 viewWillUnload viewDidUnload 方法,让您的代码有机会放弃与视图层次结构相关联的任何对象的所有权,包括从中加载的对象nib文件,在viewDidLoad方法中创建的对象,以及在运行时延迟创建并添加到视图层次结构的对象。在iOS 6上,视图永远不会被清除,并且永远不会调用这些方法。如果视图控制器需要在内存不足时执行特定任务,则应覆盖 didReceiveMemoryWarning 方法。

因此,无需在任何地方将任何IBOutlet引用设置为nil,因为不再清除视图。在didReceiveMemoryWarning或类似的东西中将它们设置为nil是没有意义的。但是,如果你通过释放容易重新创建的模型对象,清空缓存等,在viewDidUnload中响应低内存事件,那么那些东西应该是绝对的转到didReceiveMemoryWarning。

答案 3 :(得分:0)

自iOS6以来,内存警告不再自动卸载视图。这并不意味着记忆的使用当然不再是任何问题,你不能只是“忘记”它。

IBOutlets通常应为weak,因为它们(直接或间接)由viewcontroller的视图“拥有”。通常你希望他们的一生与父母的观点相同。

你仍然应该尝试在didReceiveMemoryWarning中清除尽可能多的内存。 (当前未使用的资产的记忆,当然可以重新创建)