ARC是编译器特性(LLVM3.0编译器),不是运行时特性,和垃圾回收有本质的区别
Automatic Reference Counting 自动引用计数 当ARC开启时,编译器会自动在合适的地方加入retain release autorelease 关键字
0.ARC的判断准则
只要没有强指针指向对象,对象就会被释放(在ARC下,暂时忘记引用计数)
1.ARC下的释放准则
只要还有一个强指针指向对象,对象就会保存在内存中
既 可以通过
--1.可以通过给指针赋值nil
或者
--2.将当前引用该实例对象的强指针通过__weak 修饰成弱指针 (弱指针在指向对象被销毁后,自动将该指针至为nil )
达到释放指针所指向的实例对象的目的
2.强指针
--1.默认所有指针变量都是强指针
--2.被__strong 修饰的指针
3.弱指针
--1.被__weak 修饰的指针
弱指针的极端使用场景,当场释放,因为alloc 在堆中,栈中的p是弱指针,根据ARC准则:一个实例对象只要没有强指针引用就会被释放
无论是strong 还是weak 类型的指针 都不在会指向一个僵尸对象,会被至为nil 从根源上解决了意外释放导致的carsh
5.ARC下@property参数
strong 用于OC对象,相当于MRC中的Retain,不同的是,在strong 指针指向的对象 被释放时,该指针会自动至为nil 防止carsh
weak 用于OC对象,相当于MRC中的assign的使用技巧,但是weak 指针指向的对象被释放后,会自动至为nil
assign 用于基本数据类型,和MRC中的assign相同,用于修饰基本数据类型,若使用其指向对象,在对象被释放后,指针则会变成野指针(指向被释放的僵尸对象),再次调用会导致carsh
6.ARC中的循环引用
和MRC中类似 原理
在ARC中处理循环引用 需要将其中一个引用改为 weak 修饰词 其中assign 用来专门修饰基本数据类型,修饰对象建议使用weak