美文网首页
iOS 内存管理 (3):自动的引用计数(Automatic R

iOS 内存管理 (3):自动的引用计数(Automatic R

作者: 知礼账本 | 来源:发表于2020-03-18 11:00 被阅读0次

    引用计数(Reference Count)是一个简单而有效的管理对象生命周期的方式。
    任何一个对象,刚创建的时候引用计数为1(alloc/new/copy)
    当且仅当对象的引用计数为0时,系统才会回收这个对象(dealloc)

    MRC 手动管理引用计数

    在 OC 中,NSObject 提供了 alloc 类方法,retain/release/dealloc实例方法用于内存管理,MRC 就是通过手动调用这些方法来实现对象引用计数的增加和减少。手动管理内存需要遵守以下几个原则:

    自己生成的对象,自己所持有

    当程序调用方法名以 alloc/new/copy/mutableCopy 开头的方法来创建对象时,意味着自己生成的对象只有自己持有,该对象的引用计数+1。

    非自己生成的对象,自己也能持有

    当程序调用对象的 retain 方法时,意味着程序持有了非自己生成的对象,该对象的引用计数+1。

    不再需要自己持有的对象时释放

    自己持有的对象,一旦不再需要,无论是否是自己生成的,持有者都有义务释放该对象。程序通过调用对象的 release 方法释放该对象,引用计数-1

    autorelease

    autorelease是一种支持引用计数的内存管理方式,只要给对象发送一条autorelease消息,会将对象放到一个自动释放池 autorelease pool 中,而对象本身的引用计数并不增加,类似于 C 语言中局部变量的特性。在程序主循环的 RunLoop 或在其他程序可运行的地方,会对 release pool 对象进行生成、持有和废弃处理。当自动释放池被销毁时,会对池子里面的所有对象做一次release操作,从而达到管理引用计数的目的。


    image
    非自己持有的对象不能释放

    对于既不是以 alloc/new/copy/mutableCopy 开头的方法生成并持有的对象也不是用 retain 方法持有的对象,绝对不能使用 release 方法释放对象,否则就会造成程序崩溃。

    ARC 自动管理引用计数

    管理引用计数的本质部分在 ARC 中其实并没有发生改变,ARC 只是会自动地帮我们处理引用计数。ARC 是编译器特性,而不是运行时特性,可以对每个文件选择使用或不使用 ARC,若使用 ARC,编译器在编译时会帮我们自动的插入MRC中提到的相关代码,包括retain/release/copy/autorelease/autoreleasepool等等,通过自动生成的代码去自动释放或保持对象。

    ARC 中,我们不再使用 retain/release/autorelease 方法来管理内存,而是为每个变量添加所有权修饰符,系统通过变量的所有权修饰符判断如何处理引用计数。

    strong

    __strong 修饰符是 id 类型和所有对象类型默认的所有权修饰符,表示对对象的强引用,对应属性声明中的 strong/retain/copy 属性。在 ARC 中,给被 __strong 修饰符修饰的变量赋值即可达成对对象的持有,而该变量在超出其变量作用域后被废弃,随着强引用的失效,其引用的对象也会随之释放,从而达到管理引用计数的目的。

    weak

    __weak 修饰符表示对对象的弱引用,对应属性声明中的 weak 属性。在 ARC 中,弱引用不能持有对象实例,所以在超出其变量作用域时,对象即被释放,可以用来避免出现循环引用的问题。在持有某对象的弱引用时,若该对象被废弃,则此弱引用会自动失效,且处于赋值 nil 的状态。

    unsafe_unretained

    __unsafe_unretained 修饰符是不安全的所有权修饰符,对应属性声明中的 assign/unsafe_unretained 属性。在 ARC 中,被 __unsafe_unretained 修饰的变量不属于编译器的内存管理对象。

    autorelease

    ARC 中虽然不能调用 autorelease,但是可以通过将对象赋值给附加了 __autorelease 修饰符的变量来替代调用 autorelease 方法,将对象注册到 autorelease pool。

    关于ARC的实现:

    (ARC的实现)https://www.jianshu.com/p/b13983e341fd

    相关文章

      网友评论

          本文标题:iOS 内存管理 (3):自动的引用计数(Automatic R

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