|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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之间怎么切换的 |
|