美文网首页编写高质量代码的52个有效方法
52个有效方法(29) - 理解引用计数

52个有效方法(29) - 理解引用计数

作者: SkyMing一C | 来源:发表于2018-09-06 16:23 被阅读6次
  • Objective-C语言使用引用计数来管理内存,每个对象都有个可以递增或递减的计数器。

  • 如果想使某个对象继续存活,那就递增其引用计数;用完了之后,就递减其引用计数。

  • 计数变为0,就表示没人关注此对象了,就可以把它销毁。

引用计数
引用计数工作原理
  • NSObject协议声明了下面三个方法用于操作计数器,以递增或递减其值。

    • retain 递增保留计数。

    • release 递减保留计数。

    • autorelease 待稍后清理“自动释放池”(autorelease pool)时,再递减保留计数。

  • 对象创建出来时,其保留计数至少为1。

  • 对象如果持有指向其他对象的强引用(strong reference),那么前者就“拥有”(own)后者。对象想令其所引用的那些对象继续存活,就可将其“保留”。等用完了之后,再释放。

  • 为避免在不经意间使用了无效对象,一般调用完release之后都会清空指针。这就能保证不会出现“悬挂指针”(dangling pointer)。

属性存取方法中的内存管理
  • 若属性为“strong关系”(strong relationship),则设置的属性值会保留
- (void)setFoo:(id)foo
{
    [foo retain];
    [_foo release];
    _foo = foo;
//此方法将保留新值并释放旧值,然后更新实例变量,令其指向新值。顺序很重要。
}   
自动释放池
  • 调用autorelease会在稍后递减计数,通常是在下一次“时间循环”(event loop)时递减,不过也可能执行的更早些。

  • 调用autorelease可以保证对象在跨越“方法调用边界”(method call boundary)后一定存活。

保留环
  • 通常采用“弱引用”(weak reference)或是"从外界命令循环中的某个对象不再保留另一个对象"方法打破保留环,从而避免内存泄露。
主动断开循环引用
  • 代理使用weak关键字修饰。weak会在销毁delegate指向的对象后,delegate置为nil,这样就没有野指针产生。如果用assign关键字修饰,也有weak的功效。但assign是指针赋值,不对引用计数操作,使用之后如果没有置为nil,可能就会产生野指针。
要点
  1. 引用计数机制通过可以递增递减的计数器来管理内存。对象创建好之后,其保留计数至少为1.若保留计数为正,则对象继续存活。当保留计数将为0时,对象就被销毁了。

  2. 在对象生命周期中,其余对象通过应用来保留或释放此对象。保留与释放操作分别会递增及递减保留计数。

相关文章

网友评论

    本文标题:52个有效方法(29) - 理解引用计数

    本文链接:https://www.haomeiwen.com/subject/sjsawftx.html