iOS内存暴增问题追查与使用陷阱.docxVIP

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

iOS内存暴增问题追查与使用陷阱

?

?

2iOS平台内存使用原则

2.1对象的所有权与销毁

2.1.1谁创建,谁释放;

如果是以alloc,new或者copy,mutableCopy创建的对象,则必须调用release或者autorelease方法释放内存;

如果没有释放,则导致内存泄漏!

2.1.2谁retain,谁释放;

如果对一个对象发送retain消息,其引用计数会+1,则使用完必须发送release或者autorelease方法释放内存或恢复引用计数;

如果没有释放,则导致内存泄漏!

2.1.3没创建且没retain,别释放;

不要释放那些不是自己alloc或者retain的对象,否则程序会crash;

不要释放autorelease的对象,否则程序会crash;

2.2对象的深拷贝与浅拷贝

一般来说,复制一个对象包括创建一个新的实例,并以原始对象中的值初始化这个新的实例。复制非指针型实例变量的值很简单,比如布尔,整数和浮点数。复制指针型实例变量有两种方法。一种方法称为浅拷贝,即将原始对象的指针值复制到副本中。因此,原始对象和副本共享引用数据。另一种方法称为深拷贝,即复制指针所引用的数据,并将其赋给副本的实例变量。

2.2.1深拷贝

深拷贝的流程是先创建一个新的对象且引用计数为1,并用旧对象的值初始化这个新对象;

ClassA*objA=[[ClassAalloc]init];

ClassA*objB=[objAcopy];

objB是一个新对象,引用计数为1,且objB的数据等同objA的数据;

注意:objB需要释放,否则会引起内存泄漏!

2.2.2浅拷贝

浅拷贝的流程是,无需引入新的对象,把原有对象的引用计数+1即可

ClassA*objA=[[ClassAalloc]init];

ClassA*objB=[objAretain];

注意:objB需要释放,恢复objA的引用计数,否则会引起内存泄漏!

2.3对象的存取方法

2.3.1属性声明和实现

变量声明的常用属性类型包括readonly,assign,retain和copy;且系统会自动为声明了属性的变量生成set和get函数;

readonly属性:只能读,不能写;

assign属性:是默认属性,直接赋值,没有任何保留与释放问题;

retain属性:会增加原有对象的引用计数并且在赋值前会释放原有对象,然后在进行赋值;

copy属性:?会复制原有对象,并在赋值前释放原有对象,然后在进行赋值;

2.3.2使用属性声明可能带来的隐患

当一个非指针变量使用retain(或者copy)这个属性时,尽量不要显性的release这个变量;直接给这个变量置空即可;否则容易产生过度释放,导致程序crash;例如:

ClassA类的strName是NSString*类型的变量且声明的属性为retain;

ClassA.strName=nil;?/*释放原有对象且对此对象赋值为空*/

[ClassA.strNamerelease];/*strName内存可能已经被释放过了,将导致程序crash*/

Assign这个属性一般是非指针变量(布尔类型,整形等)时用这个类型;属于直接赋值型,不需要考虑内存的保留与释放;

如果一个指针类型的变量使用assign类型的属性,有可能引用已经释放的变量;导致程序crash;例如:

ClassB*obj=[[[ClassBalloc]init]autorelease];

……

ClassA.strName=obj;/*strName指向obj的内存地址*/

后续在使用ClassA.strName的时候,因为obj是autorelease的,可能obj的内存已经被回收;导致引用无效内存,程序crash;

3iOS平台AutoRelease机制

3.1自动释放池的常见问题

大家在开发iOS程序的时候,是否遇到过在列表滑动的情况内存莫名的增长,频繁访问图片的时候内存莫名的增长,频繁的打开和关闭数据库的时候内存莫名的增长……这些都是拜iOS的autorelease机制所赐;具体分析如下:

1:滑动列表的时候,内存出现莫名的增长,原因可能有如下可能:

1:没有使用UITableView的reuse机制;导致每显示一个cell都用autorelease的方式重新alloc一次;导致cell的内存不断的增加;

2:每个cell会显示一个单独的UIView,在UIView发生内存泄漏,导致cell的内存不断增长;

2:频繁访问图片的时候,内存莫名的增长;

频繁的访问网络图片,导致iOS内部API,会不断的分配autore

文档评论(0)

158****9567 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档