didReceiveMemoryWarning

didReceiveMemoryWarning

我正在读一本书,建议我的应用收到内存不足警告时,将IBOutlets声明为weak应该可以解决此问题。例如,我现在不再需要在viewDidUnload方法中将这些出口设置为nil。

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

无论如何,我应该如何继续,我应该将IBOutlet声明为weak,并且“忘记”实现didReceiveMemoryWarningsviewDidUnloads的方法吗?

最佳答案

并非所有IBOutlets都应设为weakApple docs (Resource Programming guide)的推荐

除了从文件所有者到笔尖文件(或在iOS中为情节提要场景)中的顶级对象的插座外,插座通常应较弱。因此,您创建的插座通常应该比较弱,因为:

  • 您创建到例如视图控制器视图的子视图或窗口控制器窗口的子视图的插座是对象之间的任意引用,并不表示所有权。
  • 强势出口经常由框架类指定(例如,UIViewController的视图出口或NSWindowController的窗口出口)。

  • 例:
    XIB中的顶级对象应声明为strong,任何其他子视图/控件均应设置为weak属性。
        @property (nonatomic, weak)   IBOutlet MyView *viewContainerSubview;
        @property (nonatomic, strong) IBOutlet MyOtherClass *topLevelObj;
    

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

    __weak指定一个引用,该引用不能使引用的对象保持 Activity 状态。如果没有对对象的强引用,则将弱引用设置为nil。

    因此,您无需担心设置IBOutlets nil,其生存期将自动受其顶级实例约束。
    应该实现didReceiveMemoryWarning来清除占用内存的所有可重新创建的资源。当您收到didReceiveMemoryWarning调用时,应使用它释放未使用的非关键资源,例如自定义数据结构,用于填充UI的Web服务响应等。任何资源的非关键性都需要由开发人员确定。

    关于ios - didReceiveMemoryWarning,viewDidUnload,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18378866/

    10-15 06:38