编写高质量iOS与OS X代码的52个有效方法(五)

内存管理

引用计数工作原理

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

编写高质量iOS与OS X代码的52个有效方法(五)_第1张图片

为避免在不经意间使用了无效对象,一般调用完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来实现,在具备自动清空功能的弱引用上,可以随意读取其数据,因为这种引用不会指向已经回收过的对象。

你可能感兴趣的:(编写高质量iOS与OS X代码的52个有效方法(五))