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

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

ID:41519392

大小:319.37 KB

页数:12页

时间:2019-08-26

iOS内存暴增问题追查与使用陷阱_第1页
iOS内存暴增问题追查与使用陷阱_第2页
iOS内存暴增问题追查与使用陷阱_第3页
iOS内存暴增问题追查与使用陷阱_第4页
iOS内存暴增问题追查与使用陷阱_第5页
资源描述:

《iOS内存暴增问题追查与使用陷阱》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、iOS内存暴增问题追查与使用陷阱原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处,作者信息和本声明。否则将追究法律责任。hg://baidutech.blog.51clo.com/4114344/742967iOS平台的内存使用引用计数的机制,并且引入了半自动释放机制;这种使用上的多样性,导致开发者在内存使用上非常容易出现内存泄漏和内存莫名的增长情况;木文会介绍iOS平台的内存使用原则与使用陷阱;深度剖析autorelease机制;低内存报警后的处理流程;并结合自身实例介绍内存暴增的问题追查记录以及相关工具的使用情况;TAG内存暴增,内存泄漏,autorclcasc;

2、内存报警;iOS平台内存常见问题作为iOS平台的开发者,是否曾经为内存问题而苦恼过?内存莫名的持续增长,程序莫名的crash,难以发现的内存泄漏,这些都是iOS平台内存相关的常见问题;木文将会详细介绍iOS平台的内存管理机制,autorclcasc机制和内存的使用陷阱,这些将会解决iOS平台内存上的大部分问题,提高了程序的稳定性;1iOS平台内存管理介绍iOS平台的内存管理采用引用计数的机制:当创建一个对象时使用alloc或者allWithZone方法时,引用计数就会+1;当释放对象使用release方法时,引用计数就是这就意味着每一个対象都会跟踪有多少其他对象引用它,一旦引用计

3、数为0,该对象的内存就会被释放掉;另外,iOS也提供了一种延时释放的机制AutoRelease,以这种方式申请的内存,开发者无需手动释放,系统会在某一时机释放该内存;山于iOS平台的这种内存管理的多样性,导致开发者在内存使用上很容易出现内存泄漏或者程序莫名崩溃的情况,木文会详细介绍iOS平台内存的使用规范与技巧以及如何利用工具避免或者发现问题;下图是内存从申请到释放的一个完整示例:alloc/initreleosereleaseRetailcount・1retoinClassCdassAalloc/initClassA引毛计数=1:aClassBretainClassAClass

4、A引壬计数=2:ClassCcopyClassAClassA引用计数=2:ClassC引毎计数ClassAreleaseClassCreleaseClassBreleaseClassAV%*^*Zw*ZZw*w*w*引壬计数=1:2iOS平台内存使用原则2.1对象的所有权与销毁ClassC引用计数=0;ClassA弓库计数=0:vwvvvwwvv^*系统谒屯dealloc系统遁Wdealloc2.1.1谁创建f谁释放;如果是以alloc,new或者copy,mutableCopy创建的对象,则必须调用release或者autorelease方法释放内存;如果没有释放,则导致内存泄

5、漏!2.1.2谁retain,谁释放;如果对一个对象发送retain消息,其引用讣数会+1,则使用完必须发送release或者autorclcasc方法释放内存或恢复引用计数;如果没有释放,则导致内存泄漏!2.1.3没创建且没retain,别释放;不要释放那些不是自己alloc或者retain的对象,否则程序会crash;不要释放autorelease的对象,否则程序会crash;2.2对象的深拷贝与浅拷贝一般来说,复制一个对彖包括创建一个新的实例,并以原始对象中的值初始化这个新的实例。复制非指针型实例变量的值很简单,比如布尔,整数和浮点数。复制指针型实例变量有两种方法。一种方法

6、称为浅拷贝,即将原始对象的指针值复制到副本中。因此,原始对象和副本共享引用数据。另一种方法称为深拷贝,即复制指针所引用的数据,并将其赋给副本的实例变量。2.2.1深拷贝深拷贝的流程是先创建一个新的对象尺引用计数为1,并用旧对象的值初始化这个新对象;ClassA*objA=[[ClassAalloc]initj;ClassA*objB=[objAcopy];objB是一个新对象,引用计数为1,且objB的数据等同objA的数据;注意:objB需要释放,否则会引起内存泄漏!2.2.2浅拷贝浅拷贝的流程是,无需引入新的对象,把原有对象的引用计数+1即可ClassA*objA=[[Cla

7、ssAalloc]initj;ClassA*objB=[objAretain];注意:objB需耍释放,恢复objA的引用计数,否则会引起内存泄漏!2.3对象的存取方法2.3.1属性声明和实现变量声明的常用属性类型包括readonly,assign,retain和copy;且系统会自动为声明了属性的变量生成set和gel函数;readonly属性:只能读,不能写;assign属性:是默认属性,直接赋值,没有任何保留与释放问题;retain属性:会增加原有对象的引用计数并且在赋值前

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。