您的位置:首页 > 移动开发 > IOS开发

iOS6,iOS5内存警告的兼容处理

2013-05-30 09:53 253 查看
iOS6:viewDidUnload被废弃。

系统会自动控制大的View所占用的内存,其他小的View所占用的内存是极其微小的,不值得为了省内存而去清理然后在重新创建。如果你需要在内存警告的时候释放业务数据或者做些其他的特定处理,你可以实现 didReceiveMemoryWarning 这个函数。

怎么实现做?

//========== iOS6,iOS5内存警告的兼容处理如下 ============

-(void)didReceiveMemoryWarning

{

[super didReceiveMemoryWarning];//即使没有显示在window上,也不会自动的将self.view释放。

// Add code to clean up any of your own resources that are no longer necessary.

// 此处做兼容处理需要加上ios6.0的宏开关,保证是在6.0下使用的,6.0以前屏蔽以下代码,否则会在下面使用self.view时自动加载viewDidUnLoad

if ([[UIDevice currentDevice].systemVersion compare:@“6.0” options:NSNumericSearch] ==NSOrderedSame

||[[UIDevice currentDevice].systemVersion compare:@“6.0” options:NSNumericSearch] == NSOrderedAscending​) {

//需要注意的是self.isViewLoaded是必不可少的,其他方式访问视图会导致它加载 ,在WWDC视频也忽视这一点。

if (self.isViewLoaded && !self.view.window)// 是否是正在使用的视图

{

// Add code to preserve data stored in the views that might be

// needed later.

// Add code to clean up other strong references to the view in

// the view hierarchy.

self.view = nil;// 目的是再次进入时能够重新加载调用viewDidLoad函数。

}

}

}

// IOS6.x 不再会调到此方法, 兼容iOS5

- (void)viewDidUnload

{

[super viewDidUnload];

[self unLoadViews]; // 该方法可以在子类中实现

}

最好不要把 subView 当成成员变量来持有。使用tag来操作。

注:

*UIView是UIResponder的子类,而UIResponder有一个CALayer的成员变量,CALayer是具体用于将自己画到屏幕上的。

*CALayer是一个bitmap图象的包装类,当UIView调用自身的drawRect时,CALayer才会创建这个bitmap图象类。

*具体占内存的其实是一个bitmap图象类,CALayer只占48bytes, UIView只占96bytes。而一个iPad的全屏UIView的bitmap类会占到12M的大小!

*在iOS6时,当系统发出MemoryWarning时,系统会自动回收bitmap类。但是不回收UIView和CALayer类。这样即回收了大部分内存,又能在需要bitmap类时,根据CALayer类重建。

*所以,iOS6这么做的意思是:我们根本没有必要为了几十byte而费力回收内存。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: