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。

 

posted on 2013-05-28 22:16  VicStudio  阅读(316)  评论(0编辑  收藏  举报