iOS 6.0不同版本内存警告的统一处理
在iOS6.0以下,当系统收到内存警告,会先调- (void)didReceiveMemoryWarning ,不在当前页面的controller会继续调- (void)viewDidUnload 去释放不必要的view,所以我们可以在viewDidUnload把某些子view释放以回收内存。
但是在iOS6.0以上,controller只会收到didReceiveMemoryWarning,不再调用viewDidUnload,也就是苹果不会去主动释放view。所以我们可以封装以下,让6.0以上和以下版本收到内存警告都统一调一个函数,以用来释放子view。
代码如此:写一个基类BaseViewController,实现如下方法,这样子类内存警告的处理都放在了viewShouldUnLoad。
- (void)viewShouldUnLoad {
// 子类中去实现
}
// IOS6.x 不再会调到此方法
- (void)viewDidUnload {
[super viewDidUnload];
//统一调viewShouldUnLoad
[self viewShouldUnLoad];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
//如果view还没生成,不用做任何事
if (![self isViewLoaded]) {
return;
}
//6.0以上,判断如果不是当前使用的controller,就把view释放(这个判断函数大家可以自己写)
if ([[UIDevice currentDevice] systemVersionNotLowerThan:@"6.0"]) {
if (self.view.window == nil)// 是否是正在使用的视图
{
[self viewShouldUnLoad];
self.view = nil;// 目的是再次进入时能够重新加载loadview
}
}
}
子类的controller都继承BaseViewController,这样内存警告的处理都添加在viewShouldUnLoad,以防止6.0以上内存警告没有释放不必要的view。