• ARC机制


    ARC概念及原理 

    1、了解指针分类 

    (1)强指针:默认的情况下,所有的指针都是强指针,关键字strong (2)弱指针:_ _weak关键字修饰的指针
    声明一个弱指针如下:
      _ _weak Person *p; 

    2、什么是ARC? 

       Automatic Reference Counting,自动引用计数,即ARC,可以说是WWDC2011和iOS5所引入 的最大的变革和最激动人心的变化。ARC是新的LLVM 3.0编译器的一项特性,使用ARC,可以说一 举解决了广大iOS开发者所憎恨的手动内存管理的麻烦。在工程中使用ARC非常简单:只需要像往常那样编写代码,retain,release autorelease~这是ARC的基本原则。 

      当ARC开启时,编译器将自动在代码合适的地方插入retain, releaseautorelease,而作为 开发者,完全不需要担心编译器会做错(除非开发者自己错用ARC了)。 

    手动管理内存可以简称MRC (Manual Reference Counting) 

      ARC与其他语言的”垃圾回收”机制不同。ARC:编译器特性:“垃圾回收”运行时特性

      只要某个对象被任一strong指针指向,那么它将不会被销毁 

    3、ARC工作原理及判断准则 

      ARC是Objective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做的只不过是 在代码编译时为你自动在合适的位置插入release或autorelease, 

      ARC的判断准则: 只要没有强指针指向对象,对象就会被释放。 

      注意:当使用ARC的时候,暂时忘记“引用计数器”,因为判断标准变了

    1)强指针 所有的指针默认就是强指针 

    强指针使用__strong 标识 

    2)弱指针 所有的指针默认就是强指针 

    弱指针使用__week 标识 

    ARC下循环引用问题 

    person.h 

    #import <Foundation/Foundation.h> @class Dog;
    @interface Person : NSObject 

    //dog是strong 强指针
    @property (nonatomic,strong) Dog *dog; 

    @end 

    person.m 

    #import <Foundation/Foundation.h>
    @class Person;
    @interface Dog : NSObject
    //狗的主人 也是strong 强指针
    @property (nonatomic,strong) Person *owner; @end 

    main.m 

    Person *p = [Person new]; Dog *d = [Dog new]; 

    p.dog = d,仍然能够正常释放 

     

    当增加d.owner = p;时形成循环引用 

    造成循环引入 

    解决方案:
    循环引入的对象中其中一个对象设置为strong 另一个设置为weak 

    ARC下@property参数 

    ARC中的@property
    strong : 用于OC对象, 相当于MRC中的retain
    weak : 用于OC对象, 相当于MRC中的assign
    assign : 用于基本数据类型, 跟MRC中的assign一样
    copy : 一般用于NSString, 跟MRC中的copy一样 在ARC情况下解决”循环retain”的问题:@property一边用strong,一边用weak 

    ARC使用特点及注意事项 

    1、ARC特点总结 

    (1)不允许调用release,retain,retainCount

    (2)允许重写dealloc,但是不允许调用[super dealloc]

    (3)@property的参数: 

    strong:相当于原来的retain(适用于OC对象类型),成员变量是强指针

    weak:相当于原来的assign,(适用于oc对象类型),成员变量是弱指针 assign:适用于非OC对象类型(基础类型) 

    2、ARC使用注意事项 

    1)ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空(赋值为nil)操作。

    2)__weak Person *p=[[Person alloc] init];//不合理,对象一创建出来就被释放掉,对象释 放掉后,ARC把指针设置为nil。

    3)ARC中在property处不再使用retain,而是使用strong,在dealloc中不需要再
    [super dealloc]。
    @property(nonatomic,strong)Dog *dog;
    // 意味着生成的成员变量_dog是一个强指针,相当于以前的retain。

    4)如果换成是弱指针,则换成weak,不需要加_ _。 

     (参考传智如意大师!)

  • 相关阅读:
    26. Remove Duplicates from Sorted Array
    Luogu1879 [USACO06NOV]玉米田Corn Fields (状压DP)
    Luogu1655 小朋友的球 (组合数学,第二类斯特林数,高精)
    Luogu4408 [NOI2003]逃学的小孩 (树的直径)
    Luogu2574 XOR的艺术 (分块)
    Luogu3740 [HAOI2014]贴海报 (线段树)
    LuoguU72177 火星人plus (逆康拓展开)
    Luogu1919 【模板】A*B Problem升级版(FFT)
    Luogu5367 【模板】康托展开 (康拓展开)
    Luogu1088 火星人 (康托展开)
  • 原文地址:https://www.cnblogs.com/ljcgood66/p/5299387.html
Copyright © 2020-2023  润新知