• 【ARC 自动引用计数 Objective-C语言】


    前言

    ARC , Automatic Reference Counting,自动引用计数,即ARC。
    顾名思义:系统自动帮我们去计算对象的引用计数器的值。
    可以说,这门技术,是WWDC2011和iOS5引入的最大的变革和最激动人心的变化。。。
    ARC是新的LLVM3.0编译器的一项特性,使用ARC,可以说一举解决了广大iOS开发者所憎恨的手动内存管理的麻烦。

    一、怎么用ARC呢

    在程序中使用ARC非常简单,只需要像往常那样编写代码,
    只不过永远不要写retain,release,autorelease这三个关键字就好,这就是ARC的最基本的原则。关于dealloc方法,只要不调用[super dealloc];这句话,就可以写。。
    当ARC开启的时候,编译器会自动的在合适的地方插入retain,release,autorelease代码。
    编译器自动为对象做引用计数,而作为开发者,完全不需要担心编译器会做错,除非开发者自己错用了ARC。
    需要特别注意的是:ARC是编译器机制,在编译器编译代码的时候,会在适时的位置加入retain,release,autorelease代码。

    二、ARC机制下,对象何时被释放

    1.本质:ARC机制下,对象仍然有引用计数器,对象的引用计数器为0的时候,对象被释放。

    2.表象:只要没有强指针指向这个对象,这个对象就会立即回收

    三、强指针和弱指针

    1.强指针:默认情况下,我们声名1个指针,这个指针就是1个强指针,我们也可以使用__strong来显示的声明是1个强指针

    例如,有一个Person类:
    #import
    @interface Person:NSObject
    {
    int _age;
    }
    – (void)setAge:(int)age;
    – (int)age;
    – (void)sayHi;
    @end
    #import “Person.h”
    @implementation Person
    – (void)setAge:(int)age
    {
    _age = age;
    }
    – (int)age
    {
    return _age;
    }
    – (void)sayHi
    {
    NSLog(@"大家好,我是人。。。”);
    }
    – (void)dealloc
    {
    NSLog(@“人挂了。。。”);
    }
    @end
    #import
    int main()
    {
    Person *p1;//这就是1个强类型指针
    __strong Person *p2 ; //你也可以这么写,加1个标识符__strong,显示的标注这个指针是强指针

    }

    1.弱指针:使用__weak来标识的指针,就是1个弱指针

    2.无论是强指针,还是弱指针,都是指针,都可以用来存储对象的地址,这1点没有任何区别,都可以通过这个指针访问对象的成员。

    例如:
    int main()
    {
    __strong Person *p1 = [Person new];
    __weak Person *p2 = p1;
    [p1 sayHi];
    [p2 sayHi];
    }

    输出:大家好,我是人。。。

    大家好,我是人。。。

    人挂了。。。

    3.唯一的区别,就是在ARC模式下,它们用来作为回收对象的基准。在ARC机制下,如果1个对象没有任何强类型的指针指向这个对象的时候,对象就会被立即释放,例如:

    int main()
    {
    __strong Person *p1 = [Person new];
    __weak Person *p2 = p1;
    p1 = nil;//这句话执行完毕的时候,p1这个强指针就不指向这个对象了,p2这个弱指针还指向这个对象,这个对象就会被系统立即回收
    }

    4.确认程序是否开启ARC机制:

    1)默认情况下,Xcode开启ARC机制
    2)如果你还不放心的话,可以调一下retain,如果调不出来的话,说明在ARC机制下,如果能调出来,说明在MRC下面
    3)在dealloc方法中,不允许调用[super dealloc];
    4)或者,你实在放心不下,看看设置里ARC是不是YES就可以了

    5.例如:

    int main()
    {
    if(1)
    {
    Person *p1 = [Person new];
    }
    }
    这个Person 对象什么时候回收:
    1)当if语句的大括号执行完毕的时候,p1是个局部变量,p1就被回收了,也就没有强类型的指针指向Person 对象了,Person 对象也就被回收了。。。

  • 相关阅读:
    【夜读】一个人成长的最好方式,是战胜自己
    Mac用虚拟机玩游戏很卡 Mac电脑玩游戏怎么流畅运行 苹果电脑怎么畅玩Windows游戏
    使用aop拦截自定义注解
    编程小白的自学笔记十五(python办公自动化操作EXCEL表格)
    Echarts-3D柱状图
    《存储IO路径》专题:不同IO调度器的差异
    【重识云原生】第四章云网络4.7.8节——SR-IOV方案
    C++中配置json以及使用
    JS中一些判空操作,判null,判undefined操作和简化操作和if操作
    图解LeetCode——1422. 分割字符串的最大得分(难度:简单)
  • 原文地址:https://blog.csdn.net/madoca/article/details/126428446