ARC下内存管理

作者: 萌九 | 来源:发表于2016-05-18 20:30 被阅读125次

    ARC(Automatic Reference Counting):自动引用计数,可以说是WWDC2011和iOS5所引入的最大的变革和最激动人心的变化。ARC是新的LLVM 3.0编译器的一项特性,启用ARC后,开发者不需要担心内存管理,编译器会为你处理这一切*(注意ARC是编译器特性,而不是iOS运行时特性,更不是其他语言中的垃圾收集器)
    MRC(Manual Reference Counting)手动管理内存

    Objective-C的对象生成于堆之上,生成之后,需要一个指针来指向它。

    alloc:为一个新对象分配内存,并且它的引用计数为1。调用alloc方法,你便有对新对象的所有权
    copy:制造一个对象的副本(克隆体),该副本的引用计数为1,调用者具有对副本的所有权
    retain:使对象的引用计数加1,并且获得对象的所有权
    release:使对象的引用计数减1,并且放弃对象的所有权
    autorelease:使对象的引用计数在未来的某个时候减1,并且在那个时候放弃对象的所有
    
    ARC机制判断
    iOS5以后,创建项目默认的都是ARC
    ARC机制下有几个明显的标志:
    不允许调用对象的 release方法
    不允许调用 autorelease方法
    再重写父类的dealloc方法时,不能再调用 [super dealloc];
    
    ARC快速使用
    int main(int argc, const char * argv[]) {
    // 不用写release, main函数执行完毕后p会被自动释放
        Person *p = [[Person alloc] init];
        return 0;
    }
    
    ARC下@property参数
    strong : 用于OC对象, 相当于MRC中的retain(使引用计数+1)(该属性值对应 __strong 关键字,即该属性所声明的变量将成为对象的持有者)
    weak : 用于OC对象, 相当于MRC中的assign(引用计数不变)(用于对其他NSObject和其子类,就是指针类型,weak 用来修饰弱引用的属性,但是不同的是当对象被释放以后,对象自动赋值为nil;并且,delegate 和 Outlet 苹果推荐用 weak 属性来声明。同时,如上一回介绍的 iOS 5 之前的版本是没有 __weak 关键字的,所以 weak 属性是不能使用的。这种情况我们使用 unsafe_unretained)
    assign: 简单赋值,不更改索引计数(Reference Counting)(对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等))。
    copy: 建立一个索引计数为1的对象,然后释放旧对象(开辟新的内存地址)(对NSString)
    
    nonatomic关键字:
    atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,
    造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,
    那么nonatomic是一个非常好的选择。
    iOS 5 中对属性的设置新增了strong 和weak关键字来修饰属性(iOS 5 之前不支持ARC)
    

    总结:ARC 完全消除了手动管理内存的烦琐, 让程序猿更加专注于app的业务
    基本上能够避免内存泄露,有时还能更加快速,因为编译器还可以执行某些优化

    相关文章

      网友评论

        本文标题:ARC下内存管理

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