iOS中内存管理(ARC)

551 阅读2分钟

这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战

ARC

ARC是新的LLVM3.0编译器的一项特性,在工程中使用非常简单,不用再写releaseretainautorelease三个关键字。当开启ARC时,编译器将自动在代码合适的地方插入releaseretainautorelease


ARC注意点和优点

  • ARC注意点

    • ARC是编译器的特性,而不是运行时的特性
    • ARC不是其他语言中的垃圾回收,有着本质区别,其他语言是定时查看,ARC就是写好的代码,直接执行就可以
  • ARC优点

    • 完全消除了手动管理内存的繁琐
    • 基本上能够避免内存泄漏
    • 有时还能更加快速,因为编译器还可以执行某些优化
  • ARC的判断原则

    只要没有强指针指向对象,对象就会被释放

    • 强指针

      //默认所有指针变量都是强指针
      Person *p = [[Person alloc]init]; 
      
      //被_strong修饰的指针 
      __strong Person *p = [[Person alloc]init]; 
      
    • 弱指针(在开发中,千万不要使用一个弱指针保存刚刚创建的对象,会被立即释放)

      //被__weak修饰的指针
      __weak Person *p = [[Person alloc]init]; 
      

循环引用

由于对象间彼此引用,无法释放,所以,循环引用会引发内存泄漏

俩个对象彼此强引用.png

  • 如果A对象拥有B对象,而且B对象又拥有A对象,此时会形成循环retain

    @class Animal;
    @interface Person : NSObject
    @property (nonatomic,strong) Animal *animal;
    @end
    
    @class Person;
    @interface Animal : NSObject
    @property (nonatomic, strong) Person *person;
    @end
    
  • 如何解决这个问题,不要让A retain B, B retain A ARC中保存对象不用assign,用weakassign是专门用于保存基本数据类型的,保存对象用weak

    11975486-b66757c7f17e6b9f.png

    @class Animal;
    @interface Person : NSObject
    @property (nonatomic,strong) Animal *animal;
    @end
    
    @class Person;
    @interface Animal : NSObject
    @property (nonatomic, weak) Person *person;
    @end
    

关于iOS内存管理相关知识点