仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3259|回复: 20
打印 上一主题 下一主题

[学习教程] IOS制作之iOS 5与iOS 6的 low-memory 处置仓酷云

[复制链接]
小妖女 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:36:59 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
视图是仪表盘模型是发动机控制器是控制芯片CoreData---管理数据OBJC刚学的时候觉得CD很高深其实他是最容易用的库之一挪动设备终真个内存极其无限,使用程序必需做好low-memory处置事情,才干制止程序因内存利用过年夜而溃散。


low-memory处置思绪

一般一个使用程序会包括多个viewcontrollers,当从view跳转到另外一个view时,之前的view只是不成见形态,其实不会当即被清算失落,而是保留在内存中,以便下一次的疾速展现。可是假如使用程序吸收到体系收回的low-memorywarning,我们就不能不把以后不成见形态下的views清算失落,腾出更多的可以使用内存;以后可见的viewcontroller也要公道开释失落一些缓存数据,图片资本和一些不是正在利用的资本,以免使用程序溃散。

思绪是如许,详细的实行依据体系版本分歧而略有差别,本文将具体申明一下iOS5与iOS6的low-memory处置。
iOS5的处置

在iOS6之前,假如使用程序吸收到了low-memory告诫,以后不成见的viewcontrollers会吸收到viewDidUnload动静(也能够了解为主动挪用viewDidUnload办法),以是我们必要在viewDidUnload办法中开释失落一切outlets,和可再次创立的资本。以后可见的viewcontroller经由过程didReceiveMemoryWarning公道开释资本,详细见代码正文。


举一个复杂的例子,有如许一个viewcontroller:

  • @interfaceMyViewController:UIViewController{
  • NSArray*dataArray;
  • }
  • @property(nonatomic,strong)IBOutletUITableView*tableView;
  • @end
对应的处置则为:

  • #pragmamark-
  • #pragmamarkMemorymanagement


  • -(void)didReceiveMemoryWarning{
  • //Releasestheviewifitdoesnthaveasuperview.
  • [superdidReceiveMemoryWarning];

  • //Relinquishownershipanycacheddata,images,etcthatarentinuse.
  • }


  • -(void)viewDidUnload{
  • //RelinquishownershipofanythingthatcanberecreatedinviewDidLoadorondemand.
  • //Forexample:self.myOutlet=nil;
  • self.tableView=nil;
  • dataArray=nil;

  • [superviewDidUnload];
  • }


iOS6的处置

iOS6放弃了viewDidUnload办法,这就意味着统统必要我们本人在didReceiveMemoryWarning中操纵。
详细应当怎样做呢?
1.将outlets置为weak
当viewdealloc时,没有人握着任何一个指向subviews的强援用,那末subviews实例变量将会主动置空。

  • @property(nonatomic,weak)IBOutletUITableView*tableView;
2.在didReceiveMemoryWarning中将缓存数据置空

  • #pragmamark-
  • #pragmamarkMemorymanagement


  • -(void)didReceiveMemoryWarning
  • {
  • [superdidReceiveMemoryWarning];
  • //Dispo搜索引擎优化fanyresourcesthatcanberecreated.
  • dataArray=nil;
  • }
不要健忘一点,每当tableviewreload的时分,必要判别一下dataArray,若为空则从头创立。




兼容iOS5与iOS6


好吧,重点来了,倘使但愿程序兼容iOS5与iOS6怎样办呢?
这里有一个小技能,我们必要对didReceiveMemoryWarning做一些四肢举动:

  • #pragmamark-
  • #pragmamarkMemorymanagement


  • -(void)didReceiveMemoryWarning
  • {
  • [superdidReceiveMemoryWarning];

  • if([selfisViewLoaded]&&self.view.window==nil){
  • self.view=nil;
  • }

  • dataArray=nil;
  • }
判别一下view是不是是window的一部分,假如不是,那末能够宁神的将self.view置为空,以调换更多可用内存。
如许会是甚么征象呢?假设,从viewcontrollerA跳转到viewcontrollerB,然后摹拟low-memory告诫,此时,viewcontrollerA将会实行self.view=nil;当我们从B退回A时,A会从头挪用一次viewDidLoad,此时数据全体从头创立,复杂兼容无压力~~
UPDATE-2013.5.21
1.批评中,一名仁兄供应了他的办理举措:

用代码控制view意思他们玩的都是高科技IB都是垃圾很多人也纠结到底用不用IB的确很多时候IB灵活度不行但是不需要灵活度的时候还不用IB那不是装X吗要是没人用苹果还开发IB干嘛早去掉了IB在很多时候节省很多工作量UINavigationController再说说NavigationController刚接触开发的时候不明白View和View之间怎么切换的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-16 12:19

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表