iOS 5 与 iOS 6 的 low-memory 处理

转载 2013年12月03日 19:23:21

iOS 5 与 iOS 6 的 low-memory 处理



移动设备终端的内存极为有限,应用程序必须做好low-memory处理工作,才能避免程序因内存使用过大而崩溃。



low-memory 处理思路

通常一个应用程序会包含多个view controllers,当从view跳转到另一个view时,之前的view只是不可见状态,并不会立即被清理掉,而是保存在内存中,以便下一次的快速显现。但是如果应用程序接收到系统发出的low-memory warning,我们就不得不把当前不可见状态下的views清理掉,腾出更多的可使用内存;当前可见的view controller也要合理释放掉一些缓存数据,图片资源和一些不是正在使用的资源,以避免应用程序崩溃。

思路是这样,具体的实施根据系统版本不同而略有差异,本文将详细说明一下iOS 5与iOS 6的low-memory处理。



iOS 5 的处理

在iOS 6 之前,如果应用程序接收到了low-memory警告,当前不可见的view controllers会接收到viewDidUnload消息(也可以理解为自动调用viewDidUnload方法),所以我们需要在 viewDidUnload 方法中释放掉所有 outlets ,以及可再次创建的资源。当前可见的view controller 通过didReceiveMemoryWarning 合理释放资源,具体见代码注释。


举一个简单的例子,有这样一个view controller:

  1. @interface MyViewController : UIViewController {  
  2.     NSArray *dataArray;  
  3. }  
  4. @property (nonatomic, strong) IBOutlet UITableView *tableView;  
  5. @end  

对应的处理则为:

  1. #pragma mark -  
  2. #pragma mark Memory management  
  3.   
  4.   
  5. - (void)didReceiveMemoryWarning {  
  6.     // Releases the view if it doesn't have a superview.  
  7.     [super didReceiveMemoryWarning];  
  8.       
  9.     // Relinquish ownership any cached data, images, etc that aren't in use.  
  10. }  
  11.   
  12.   
  13. - (void)viewDidUnload {  
  14.     // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.  
  15.     // For example: self.myOutlet = nil;  
  16.     self.tableView = nil;  
  17.     dataArray = nil;  
  18.       
  19.     [super viewDidUnload];  
  20. }  





iOS 6 的处理

iOS 6 废弃了viewDidUnload方法,这就意味着一切需要我们自己在didReceiveMemoryWarning中操作。重写了viewDidUnload也是会执行的。


1.将 outlets 置为 weak
当view dealloc时,没有人握着任何一个指向subviews的强引用,那么subviews实例变量将会自动置空。

  1. @property (nonatomic, weak) IBOutlet UITableView *tableView;  


2.在didReceiveMemoryWarning中将缓存数据置空

  1. #pragma mark -  
  2. #pragma mark Memory management  
  3.   
  4.   
  5. - (void)didReceiveMemoryWarning  
  6. {  
  7.     [super didReceiveMemoryWarning];  
  8.     // Dispose of any resources that can be recreated.  
  9.     dataArray = nil;  
  10. }  


不要忘记一点,每当tableview reload 的时候,需要判断一下 dataArray ,若为空则重新创建。




兼容iOS 5 与 iOS 6


好吧,重点来了,倘若希望程序兼容iOS 5 与 iOS 6怎么办呢? 
这里有一个小技巧,我们需要对didReceiveMemoryWarning 做一些手脚:


  1. #pragma mark -  
  2. #pragma mark Memory management  
  3.   
  4.   
  5. - (void)didReceiveMemoryWarning  
  6. {  
  7.     [super didReceiveMemoryWarning];  
  8.       
  9.     if ([self isViewLoaded] && self.view.window == nil) {  
  10.         self.view = nil;  
  11.     }  
  12.       
  13.     dataArray = nil;  
  14. }  

判断一下view是否是window的一部分,如果不是,那么可以放心的将self.view 置为空,以换取更多可用内存。
这样会是什么现象呢?假如,从view controller A 跳转到 view controller B ,然后模拟low-memory警告,此时,view controller A 将会执行self.view = nil ; 当我们从 B 退回 A 时, A 会重新调用一次 viewDidLoad ,此时数据全部重新创建,简单兼容无压力~~


Note:
如果你好奇Apple为什么废弃viewDidUnload,可以看看Apple 的解释:
Apple deprecated viewDidUnload for a good reason. The memory savings from setting a few outlets to nil just weren’t worth it and added a lot of complexity for little benefit. For iOS 6+ apps, you can simply forget about view unloading and only implement didReceiveMemoryWarning if the view controller can let go of cached data that you can recreate on demand later.

怎样处理iOS 5与iOS 6的 low-memory

移动设备终端的内存极为有限,应用程序必须做好low-memory处理工作,才能避免程序因内存使用过大而崩溃。   low-memory 处理思路 通常一个应用程序会包含多个view co...
  • u010013695
  • u010013695
  • 2013年07月11日 20:36
  • 573

iOS 5与iOS 6的 low-memory 处理

移动设备终端的内存极为有限,应用程序必须做好low-memory处理工作,才能避免程序因内存使用过大而崩溃。   low-memory 处理思路 通常一个应用程序会包含多个view co...
  • gufeibaixue
  • gufeibaixue
  • 2013年08月21日 14:54
  • 308

iOS崩溃日志的处理

在处理iOS崩溃日志之前我们先来了解一下崩溃日志里面的一些东西: 第一部分:进程信息Incident Identifier: D48383A7-0EA6-48C1-B623-4D798CEXXXXX...
  • lixingqiao01
  • lixingqiao01
  • 2016年10月11日 11:48
  • 838

IOS 4,5,6,6+适配设计与切图

内容是转自:http://www.mobileui.cn/a-draft-support-ios-app-design.html
  • lipeiran1987
  • lipeiran1987
  • 2015年04月23日 15:24
  • 9089

App如何适应 iPhone 5s/6/6 Plus 三种屏幕的尺寸?(iOS的屏幕适配问题)

初代 iPhone 2007 年,初代 iPhone 发布,屏幕的宽高是 320 x 480 像素。下文也是按照宽度,高度的顺序排列。这个分辨率一直到 iPhone 3GS 也保持不变。 ...
  • allblueofthesea
  • allblueofthesea
  • 2015年02月02日 14:13
  • 1235

iOS开发~iPhone6及iPhone6P的UI适配

概要 目前为止,iPhone屏幕尺寸已经有四种: 3.5(inch):1/3G/3GS/4/4S 4.0(inch):5/5S/5C 4.7(inch):6 5.5(inch):6Plus 看一下...
  • zfpp25_
  • zfpp25_
  • 2015年09月02日 17:23
  • 2043

IOS的图标设置以及遇到的一些问题

Icon图标设置 1. Iphone Spotlight-ios5,6 Settings-ios5-8      对应的图标是: 29*29(Icon-Small.png)58*58(Ico...
  • u010427035
  • u010427035
  • 2014年11月18日 18:43
  • 987

ios判断是否为iphone6或iphone6plus代码

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) #define IS_IPHONE (UI_USER_IN...
  • LVXIANGAN
  • LVXIANGAN
  • 2015年04月26日 15:08
  • 17483

iOS extracts: Observing low-memory warnings

Observing low-memory warnings When the system dispatches a low-memory notification to your appli...
  • u011275873
  • u011275873
  • 2013年07月19日 22:22
  • 550

27.iOS内存警告处理(didReceiveMemoryWarning)

-didReceiveMemoryWarning官方文档: Handling Memory Warnings Sent to the view controller when the app...
  • wangyanchang21
  • wangyanchang21
  • 2016年02月24日 14:55
  • 1801
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS 5 与 iOS 6 的 low-memory 处理
举报原因:
原因补充:

(最多只允许输入30个字)