我有一个类来为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,但这并不意味着视图被卸载了!
那么,删除占位符的正确位置是什么?
答案 0 :(得分:1)
如果在内存不足的情况下,您希望卸载的数据很容易恢复(即可缓存),那么请实现didReceiveMemoryWarning
和UIApplicationDidEnterBackgroundNotification
将数据设置为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.
}
}