博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编写高质量iOS与OS X代码的52个有效方法(五)
阅读量:6691 次
发布时间:2019-06-25

本文共 1455 字,大约阅读时间需要 4 分钟。

##内存管理 ###引用计数工作原理 NSObject 协议声明了下面三个方法用于操作计数器,以递增或递减其值 retain 递增引用计数 release 递减引用计数 autorelease 稍后清理“自动释放池”时,在递减引用计数

为避免在不经意间使用了无效对象,一般调用完release 之后都会清空指针。这就能保证不会出现可能指向高无效对象的指针,这种指针通常称为 dangling pointer 。 ###属性存取方法中的内存管理 若属性为“strong”所修饰时,设置的属性值会保留。

-(void)setFoo:(id)foo{  [foo retain];  [_foo release];  _foo = foo;}复制代码

此方法先保留新值,并释放了旧值,然后更新实例变量,令其指向新值。顺序很重要。假如还未保留新值就先把旧制释放了,而且两个值又指向同一个对象,那么限制性的release操作就可能导致系统将此对象永久回收。而后续的retain操作则无法令这个已经彻底回收的对象复生,于是实例变量就成了悬挂指针。 ###return cycle 使用引用计数机制时,经常要注意的一个问题就是 return cycle,就是呈环形状相互引用多个对象,这将导致内存泄露,因为循环中的对象其保留计数不会降为0。对循环中的每一个对象来说,至少有另外一个对象引用着它,垃圾回收器会把相互引用的对象全部回收走,而OC 引用技术架构中,则享受不到这种便利,通常采用 weak reference 来解决次问题,从而避免内存泄露。

引用计数机制通过可以递增递减的计数器来管理内存。对象创建好后,其保留计数至少为1.若保留计数为正,则对象继续存活。当保留计数降为0时,对象就被销毁了。 在对象生命期中,其余对象通过引用来保留或释放此对象。保留与释放操作分别会递增及递减保留计数。

##以ARC简化引用计数 ARC环境下回自动执行retain release autorelease dealloc,所以在ARC调用这些方法是非法的 在ARC之后,程序员就无须担心内存管理问题了。使用ARC来编程,可省去类中的许多样板代码。 ARC管理对象生命期的办法基本上就是:在合适的地方插入保留及释放操作。在ARC环境下,变量的内存管理语义总是通过方法名来体现。ARC将此确定为开发者必须遵守的规则。 ARC只负责管理Objective-C对象的内存。尤其要注意:CoreFoundation对象不归ARC管理,开发者必须适时调用CFRetain/CFRelease。

##在dealloc方法中只释放引用并解除监听 在dealloc方法里,应该做的事情就是释放指向其它对象的引用,并取消原来订阅的键值观测或NSNotificationCenter等通知,不要做其他事情。 如果对象持有文件描述符等系统资源,那么应该专门编写一个方法来释放此种资源。这样的类要和其使用者约定“用完资源后必须调用close方法。 执行异步任务的方法不应在dealloc里调用;只能在正常状态下执行的那些方法也不应在dealloc里调用,因为此时对象已处于正在回收的状态了。

##以弱引用避免重复引用 将某些引用设为weak,可避免出现重复引用。 weak引用可以自动清空,也可以不自动清空。自动清空是随着ARC而引入的新特性,由runtime来实现,在具备自动清空功能的弱引用上,可以随意读取其数据,因为这种引用不会指向已经回收过的对象。

转载地址:http://lkeao.baihongyu.com/

你可能感兴趣的文章
Apache CarbonData:大数据生态一种新的高性能数据格式
查看>>
Macbook Pro 关闭SIP 方法
查看>>
centos下统计目录下所有文件的的个数
查看>>
(26)改变自动扫描的包【从零开始学Spring Boot】
查看>>
论Linux系统学习的奇淫异巧
查看>>
如何在国内愉快的安装 Kubernetes v1.6.2
查看>>
Mysql GTID 模式详解
查看>>
es6函数总结
查看>>
Nodejs--readline(逐行读取)
查看>>
QT创建与QT无关的纯C++程序和动态/静态库
查看>>
为网建公司注入专业前端力量
查看>>
Vbox下虚拟机linux系统安装tomcat
查看>>
Mysql 多表合并统计
查看>>
maven引入jar包问题导致项目无法启动,感叹号
查看>>
properties文件读写自己写的方法
查看>>
http升级https
查看>>
并查集(Union-Find)算法介绍
查看>>
MySQL主从配置
查看>>
8.6 管道符和作业控制
查看>>
java实现的web网络书店
查看>>