zoukankan      html  css  js  c++  java
  • OC基础(17)

    ARC基本概念

    本小节知识点:

    1. 【掌握】什么是ARC
    2. 【掌握】ARC的注意点和优点

    3. 【掌握】ARC的判断原则

    1.什么是ARC

    • Automatic Reference Counting,自动引用计数,即ARC,可以说是WWDC2011和iOS5所引入 的最大的变革和最激动人心的变化。ARC是新的LLVM 3.0编译器的一项特性,使用ARC,可以说一 举解决了广大iOS开发者所憎恨的手动内存管理的麻烦。

      • >手动管理内存, 可以简称MRC (Manual Reference Counting)
    • 在工程中使用ARC非常简单:只需要像往常那样编写代码,只不过永远不写retain,release和autorelease三个关键字就好~这是ARC的基本原则。

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


    2.ARC的注意点和优点

    • ARC的注意点

      • ARC是编译器特性,而不是运行时特性
      • ARC不是其它语言中的垃圾回收, 有着本质区别
    • ARC的优点

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

    3.ARC的判断原则

    • ARC的判断原则

      • 只要还有一个强指针变量指向对象,对象就会保持在内存中
    • 强指针

      • 默认所有指针变量都是强指针
      • 被__strong修饰的指针
     Person *p1 = [[Person alloc] init];
     __strong  Person *p2 = [[Person alloc] init];
    • 弱指针
      • 被__weak修饰的指针
    __weak  Person *p = [[Person alloc] init];
    • > 注意:当使用ARC的时候,暂时忘记“引用计数器”,因为判断标准变了。

    ARC快速入门

    本小节知识点:

    1. 【了解】ARC机制判断
    2. 【了解】ARC快速使用

    1.ARC机制判断

    • OS5以后,创建项目默认的都是ARC
    • ARC机制下有几个明显的标志:
      • 不允许调用对象的 release方法
      • 不允许调用 autorelease方法
      • 再重写父类的dealloc方法时,不能再调用 [super dealloc];

    2.ARC快速使用

    int main(int argc, const char * argv[]) {
        // 不用写release, main函数执行完毕后p会被自动释放
        Person *p = [[Person alloc] init];
        return 0;
    }

    ARC下的内存管理

    本小节知识点:

    1. 【掌握】ARC下单对象内存管理
    2. 【掌握】ARC下多对象内存管理
    3. 【掌握】ARC下循环引用问题

    4. 【掌握】ARC下@property参数

    1.ARC下单对象内存管理

    • 局部变量释放对象随之被释放
    int main(int argc, const char * argv[]) {
       @autoreleasepool {
            Person *p = [[Person alloc] init];
        } // 执行到这一行局部变量p释放
        // 由于没有强指针指向对象, 所以对象也释放
        return 0;
    }
    • 清空指针对象随之被释放
    int main(int argc, const char * argv[]) {
       @autoreleasepool {
            Person *p = [[Person alloc] init];
            p = nil; // 执行到这一行, 由于没有强指针指向对象, 所以对象被释放
        }
        return 0;
    }
    • 默认清空所有指针都是强指针
    int main(int argc, const char * argv[]) {
       @autoreleasepool {
            // p1和p2都是强指针
            Person *p1 = [[Person alloc] init];
            __strong Person *p2 = [[Person alloc] init];
        }
        return 0;
    }
    • 弱指针需要明确说明
      • 注意: 千万不要使用弱指针保存新创建的对象
    int main(int argc, const char * argv[]) {
       @autoreleasepool {
            // p是弱指针, 对象会被立即释放
            __weak Person *p1 = [[Person alloc] init];
        }
        return 0;
    }

    2.ARC下多对象内存管理

    • ARC和MRC一样, 想拥有某个对象必须用强指针保存对象, 但是不需要在dealloc方法中release
    @interface Person : NSObject
    
    // MRC写法
    //@property (nonatomic, retain) Dog *dog;
    
    // ARC写法
    @property (nonatomic, strong) Dog *dog;
    
    @end
    

    3.ARC下循环引用问题

    • ARC和MRC一样, 如果A拥有B, B也拥有A, 那么必须一方使用弱指针
    @interface Person : NSObject
    
    //@property (nonatomic, retain) Dog *dog;
    @property (nonatomic, strong) Dog *dog;
    
    @end
    
    @interface Dog : NSObject
    
    // 错误写法, 循环引用会导致内存泄露
    //@property (nonatomic, strong) Person *owner;
    
    // 正确写法, 当如果保存对象建议使用weak
    //@property (nonatomic, assign) Person *owner;
    @property (nonatomic, weak) Person *owner;
    @end

    4.ARC下@property参数

    • strong : 用于OC对象, 相当于MRC中的retain
    • weak : 用于OC对象, 相当于MRC中的assign
    • assign : 用于基本数据类型, 跟MRC中的assign一样

    ARC和MRC兼容和转换

    本小节知识点:

    1. 【掌握】ARC模式下如何兼容非ARC的类
    2. 【掌握】如何将MRC转换为ARC

    1.ARC模式下如何兼容非ARC的类

    • 转变为非ARC -fno-objc-arc
    • 转变为ARC的, -f-objc-arc (不常用)

    2.如何将MRC转换为ARC

     

  • 相关阅读:
    Java基础00-循环语句7
    Java基础00-分支语句6
    Java基础00-数据输入5
    Java基础00-运算符4
    Java基础00-基础语法3
    Java基础00-第一个程序2
    第十四题
    第十三题
    第十二题
    第十题
  • 原文地址:https://www.cnblogs.com/zhoudaquan/p/5017163.html
Copyright © 2011-2022 走看看