美文网首页
iOS开发进阶之自动引用计数

iOS开发进阶之自动引用计数

作者: 电子邮箱没有箱 | 来源:发表于2017-02-09 13:58 被阅读88次

    前言

    自动引用计数 是指内存管理中对引用采取自动计数的技术。

    OC中ARC模式是让编译器来替我们实现内存管理,我们无需再像在MRC模式下需要手动键入retain、release来进行内存管理,不但降低了程序的出错概率也减少了程序的书写工作量。这里要提一下的是,拥有ARC这样强大内存管理模式主要依赖于3.0及以上版本的LLVM编译器。但是,对于iOS开发来说,内存管理是个很重要的概念,如果先要写出内存使用效率高而又没有bug的代码,就得掌握其内存管理模型的细节。

    一、引用计数

    1.引用计数与内存管理的关系?

    在Object_C内存管理中,每个对象都有自己的应用计数器。创建一个对象,应用计数+1,如果想让对象继续存活,就递增它的应用计数,如果不再使用它,就递减它的应用计数。如果对象不再被使用之后,引用计数就记为0,系统就会销毁这个对象。引用计数的多少,表示系统中有多少个对象,想让此对象继续存活。

    2.引用计数是什么?

    引用计数,又叫保留计数,表示对象被引用的次数。引用计数,简单且有效的管理了对象的生命周期。

    3.引用计数的工作原理

    当一个对象被创建的时候(alloc),引用计数从0开始+1;

    当一个指针指向该对象,也就是一个对象想保留(retain)这个对象的时候,引用计数+1;

    当一个指针不再指向该对象,也就是一个对象想释放(release)这个对象的时候,引用计数-1;

    当一个对象的引用计数变成0的时候,系统就释放了这个对象所占用的内存,并且把这个内存标记为“可重用”(reuse),指向该对象指针都变的无效。

    4.如何操作引用计数

    a.以下是NSObject协议中声明的3个用于操作计数器的方法:

    retain : 保留。保留计数+1;如果对象被销毁,retain不再有效。

    release : 释放。保留计数 -1;如果应用计数小于1,对象内存被回收。

    autorelease :稍后(清理“自动释放池”时),再递减保留计数,所以作用是延迟对象的release;

    b. delloc

    当对象的引用计数变成0的时候,系统会调用delloc方法去销毁对象。我们可以在delloc方法中去销毁之前引用对象的指针,以及取消已经订阅的KVO,通知等。

    c.retainCount:获取引用计数的方法。

    [object retainCount];//获取引用计数的方法

    d.autorelease作用:

    autorelease不立即释放,而是注册到autoreleasepool(自动释放池),等待pool结束时,自动释放池再调用release释放。

    释放时间:每一个runloop都会创建一个自动释放池(autoreleasepool),当object执行autorelease的时候,都会把该object放入到自动释放池中,都会在runloop的尾末进行释放,当这个pool被释放的时候,这个pool中的所有的object都会被release。也就是说,正常情况下,每一个接收autorelease消息的object,在下一个runloop开始的时候都会被释放。

    二、ARC

    1.ARC是什么?

    ARC并不是垃圾回收机制(GC),ARC的官方介绍为:“自动引用计数(ARC)是一个编译器级的功能,它能简化Cocoa应用中对象生命周期管理(内存管理)的流程。”

    即,ARC是通过编译器通过静态分析能力,在编译的过程中,向代码中插入计数管理代码。

    2.ARC的作用

    a.降低内存泄漏等风险

    b.减少了开发工作量,使开发者专注于开发业务逻辑

    相关文章

      网友评论

          本文标题:iOS开发进阶之自动引用计数

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