正确的地方卸载强引用以查看viewWillUnload是否已被弃用?

时间:2015-08-16 23:01:55

标签: ios

我有一个类来为UITextView启用占位符。此类称为PlaceHolder,它具有接受视图的初始化程序。然后它将其存储在strong属性中并将其自身设置为视图委托。我将PlaceHolders数组存储在viewDidLoaded中的强数组中:

    self.placeHolders = @[[[PlaceHolder alloc]initWithControl:self.textView andPlaceHolder:@"text"]];
然后我打电话给

 -(void)viewWillUnload {
    for(PlaceHolder* holder in self.placeHolders) {
        [holder unload]; // This method does self.view = nil; in each PlaceHolder
    }
    self.placeHolders = nil;
}

尼斯。但是不推荐使用viewWillUload!它说我应该使用lowMemoryWarning,但这并不意味着视图被卸载了!

那么,删除占位符的正确位置是什么?

2 个答案:

答案 0 :(得分:1)

如果在内存不足的情况下,您希望卸载的数据很容易恢复(即可缓存),那么请实现didReceiveMemoryWarningUIApplicationDidEnterBackgroundNotification将数据设置为nil,这样释放它。通过"延迟加载"来配合这一点,这样如果您获取数据并且数据是nil,则重新构建它。这样,只有在没有内存压力(或后台内存压力有危险)的情况下,才能始终保持数据。

你可以使用NSCache自动将其自动化,但我个人从来没有机会这样做。

答案 1 :(得分:0)

我终于理解了一切,感谢Apple docs和@matt book。

由于iOS 6.0系统永远不会自动卸载视图,因为新设备具有更多RAM。但是,如果我想要,我可以自己从didReceiveMemoryWarning通过视图按下来卸载它,然后由于懒惰而会在下次访问view时自动创建。但首先我需要确保现在不显示视图。所以,正确的方法是执行以下操作:

 -(void)didReceiveMemoryWarning  { 
 [super didReceiveMemoryWarning];
 if ([self.view window] == nil) {
    // Low memory and our view is not displayed.
    // We can unload view (if we want), and when controller will be displayed, 
   // system will call self.view, and it will call loadView and then viewdidLoaded
    self.view = nil; // Unload view manually
     // Do any cleanup.
  }
}