现在我们越来越习惯于在程序中使用相机。但是,几乎在程序每次打开相机的瞬间,我们都会收到一个“Received memory warning. Level=1”内存警告 。对于iOS来说,内存永远是稀缺资源 ,因此,在你使用iPhone的高分辨率相机时,尤其需要小心。

程序员应当重视内存警告并对之进行处理,包括:

一、在viewDidUnload方法中释放内存

从iOS3.0开始, 释放内存的代码didReceiveMemoryWarning 迁移到了viewDidUnload中,我们不用覆盖didReceiveMemoryWarning方法。 事实上有不止地方会收到内存警告,因此程序中会有两个地方存在 didReceiveMemoryWarning方法:AppDelegate 和ViewController。一般,我们选择在ViewController而不是AppDelegate中处理内存警告。

当程序收到内存警告时,程序员们就必须注意了。iOS随后会自动清理当前“无用的”内存,比如内存中那些不处于顶层的ViewController和视图。

我们一般需要在viewDidUnload方法中,释放视图中无用的对象,比如UILabel、UIButton、NSArray等:

-(void)viewDidUnload

{

[super viewDidUnload];

if(ivBg)[ivBg release],ivBg=nil;

if(btSend)[btSendrelease],btSend=nil;

if(btUpload)[btUploadrelease],btUpload=nil;

if(vwBody)[vwBodyrelease],vwBody=nil;

if(backButton)[backButtonrelease],backButton=nil;

if(indicator)[indicatorrelease],indicator=nil;

if(imagePicker)[imagePickerrelease],imagePicker=nil;

if(receiverVC)[receiverVCrelease],receiverVC=nil;

}

注意,我们释放的对象必须是“无用的”。这些东西可能是任何对象,比如成员对象和UI对象。关键在于怎样认识一个对象是“有用的”还是“无用的”。实际上,对于iOS来说,任何在viewDidUnload方法中释放的东西都是“无用的”。如果你有任何对象在恢复视图时会用到,那么就不要在viewDidUnload方法中释放。例如,用户在视图中的输入——一封邮件的正文,或者用户正在编辑的图片——这些东西将在当相机使用完毕,iOS准备恢复视图时显示给用户。

如果你确实不得不节省出更多的内存,那么你可以在viewDidUnload中把一些有用的东西也释放掉,前提是,当你收到内存警告时,把这些对象持久化(保存到文件)。

而有的对象,它们本来就在xib文件中存在。在iOS恢复视图时,这些东西会从xib中恢复到内存(initWithNibName->viewDidLoad)。比如按钮、图片、静态标签等UI对象。这些对象我们就可以看作是“无用的”,在viewDidUnload方法中可以毫不客气地把它们统统释放。

二、在 didReceiveMemoryWarning 方法中设置内存警告标志

现在,虽然我们已经在viewDidUnload方法中,而不用在 didReceiveMemoryWarning方法中释放对象,但didReceiveMemoryWarning方法仍然有一个用途,就是设置内存警告变量,以让程序员知道何时收到内存警告。

首先声明一个BOOL成员作为是否收到过内存警告的标志:

BOOLmaybeSetViewNil;

然后在didReceiveMemoryWarning方法中:

maybeSetViewNil=YES;

三、在viewDidUnload方法中,保存视图数据以便恢复

在第一步中,我们提到为了“尽可能地”为iOS腾出内存,我们可以把所有对象释放,但对于“有用的”的对象,我们应该采用必要的保存策略,比如保存到文件缓存中。

仍然在viewDidUnload方法中,加入以下代码:

NSMutableDictionary*d=[[NSMutableDictionary alloc]init];

//"in use" objects

if(tfTitle){

if(tfTitle.text) [d setObject:tfTitle.text forKey:@"tfTitle.text"];

self.tfTitle=nil;

}

if(lbAttach){

if(lbAttach.text) [d setObject:lbAttach.text forKey:@"lbAttach.text"];

self.lbAttach=nil;

}

if(imageView){

if(imageView.image) {

NSData* data=UIImageJPEGRepresentation(imageView.image,0.7);

if (data)[d setObject:data forKey:@"imageView.image"];

}

self.imageView=nil;

}

if(receivers){

[dsetObject:receivers forKey:@"receivers"];

[receivers release],receivers=nil;

}

if(selectedPeople){

[dsetObject:selectedPeople forKey:@"selectedPeople"];

[selectedPeople release],selectedPeople=nil;

}

[VCCachesaveToCache:d toVC:self];

[d release];

可以看到,我们把所有“有用的”对象放到了Dictionary集合中。CCache是一个自定义类,我用它把Dictionary保存到指定文件。

四、恢复视图状态

接下来我们可以在viewDidLoad方法中恢复视图状态了:

selectedPeople=[[NSMutableArrayalloc]init];

receivers=[[NSMutableStringalloc]init];

if (maybeSetViewNil) {

NSLog(@"maybe set view nil!");

NSDictionary* d=[VCCache loadCache:self];

if(d!=nil) {// status restore

id obj=[d objectForKey:@"tfTitle.text"];

if(obj!=nil)tfTitle.text=(NSString*)obj;

obj=[d objectForKey:@"lbAttach.text"];

if(obj!=nil)lbAttach.text=(NSString*)obj;

obj=[d objectForKey:@"imageView.image"];

if(obj!=nil)imageView.image=[UIImage imageWithData:(NSData*)obj];

⋯⋯

obj=[d objectForKey:@"receivers"];

if(obj!=nil)[receivers setString:(NSString*)obj];

obj=[d objectForKey:@"selectedPeople"];

if(obj!=nil)[selectedPeople setArray:(NSArray*)obj];

}

maybeSetViewNil=NO;

}

注意,receivers和selectedPeople对象要在viewDidLoad方法中初始化,而不能在initWithNibName方法中初始化,否则对一个nil对象赋值是无效的。因为iOS在恢复视图时从loadView方法开始调用,而不是从initWithNibName方法(参考前面的图)。

iPhone相机和内存警告相关推荐

  1. ios相机内存_传iPhone 11 Pro配备相机专用内存

    中关村在线消息:近日据外媒爆料,在周三通过 Xcode 对 Apple Watch 和第七代 iPad 展开深入研究之后,开发人员 Steven Troughton-Smith 谈到了传说中的 iPh ...

  2. iphone模拟器上模拟内存警告

    有三种方法可以实现内存警告. 1.模拟器菜单:Hardware->Simulate Memory Warning 2.用程序的方法实现,只需要一句代码: CFNotificationCenter ...

  3. 苹果手机相机九宫格怎么设置_瞧不起iPhone相机?苹果手机5个逆天拍照功能,效果惊艳堪比单反...

    经常有人说苹果手机拍照效果差?要么是被美颜相机惯坏了,要么根本就不知道苹果拍照隐藏功能!国外的大神都是用苹果手机拍vlog,为什么别人就能拍出 "大片"既视感?而我只能拍出乡村爱情 ...

  4. iOS 真机模拟内存警告

    //联系人:石虎 QQ:1224614774 昵称:嗡嘛呢叭咪哄 一.概念 1.内存警告原理 *iphone下每个app可用的内存是被限制的,如果一个app使用的内存超过20M,则系统会向该app发送 ...

  5. iOS内存警告和内存优化集合二

    iphone下每个app可用的内存是被限制的,如果一个app使用的内存超过20M,则系统会向该app发送Memory Warning消息.收到此消息后,app必须正确处理,否则可能出错或者出现内存泄露 ...

  6. 教程:使用iPhone相机和openCV来完成3D重建(第二部分)...

    本文为 AI 研习社编译的技术博客,原标题 : Tutorial: Stereo 3D reconstruction with openCV using an iPhone camera. Part ...

  7. 解决MWPhotoBrowser中的SDWebImage加载大图导致的内存警告问题

    本文转载至 http://www.superqq.com/blog/2015/01/22/jie-jue-mwphotobrowserzhong-de-sdwebimagejia-zai-da-tu- ...

  8. IOS小知识点5之内存警告、循环引用、交叉引用

    IOS的内存使用有以下几个等级,最常见的就是OSMemoryNotificationLevelWarning  OSMemoryNotificationLevelUrgent typedef enum ...

  9. CDH交换内存警告解决方法

    交换内存定义:Linux中Swap(即:交换分区),类似于Windows的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况 现象:交换内存警告如下 解决方法: ...

最新文章

  1. hosts文件连接服务器失败,ssh连接远程服务器出现Host key验证失败的解决方案
  2. java mongodb 使用MongoCollection,BasicDBObject 条件查询
  3. 8.2.4临时表和正式表
  4. ORACLE11G RAC增加节点操作
  5. [渝粤教育] 郑州航空工业管理学院 航空概论 参考 资料
  6. 持久代是方法区还是堆中的?
  7. 字符模式下构建、使用KVM虚拟化平台
  8. java 线程 condition_Java编程中实现Condition控制线程通信
  9. SecureCRT自动化脚本编写
  10. 2019年2月CNNIC第43次《中国互联网络发展状况统计报告》
  11. Android 面试中高级上
  12. R 两表格跟据某列相同值进行合并
  13. html怎么做一个动态广告图,用CSS3实现广告的展示动画特效
  14. 物理层技术前沿_西安交通大学:通信网络安全先进技术研讨会:密码安全专场...
  15. QtCreator 忽略指定警告
  16. 计算机中全半角转换是干什么的,全角半角切换快捷键(电脑全角和半角怎么切换)...
  17. Android 蓝牙传导和耦合测试介绍
  18. Mac终端添加快捷命令
  19. 2012年苏州大学872真题整理
  20. 上课笔记--台大政治学基础之美国选举制度与意识形态

热门文章

  1. HTTP请求头中的User-Agent字段
  2. Astyle格式批处理-完美处理C代码
  3. 当Java泛型擦除遇到JSON序列化和反序列化
  4. 2014年总结--不再年少
  5. 男女生链表创建和合并
  6. 第八章 交互技术,8.2 淘宝直播在双11的互动实践(作者:丰火)
  7. Hive函数与文件格式
  8. 又被人骗了,真是郁闷!
  9. mac启动台图标重置
  10. SpringBoot 抵御XSS攻击