从JAVA转到IOS开发,接触的不知道是多少年前的OC代码,还是MRC的,结果就悲剧了,各种痛苦。然后用MRC写了大半年,终于忍受不了,学习一下ARC,提高一下编程的效率。
ARC的开启和关闭
如果需要对特定文件开启或关闭ARC,可以在工程选项中选择Targets -> Build Phases -> Compile Sources,在里面找到对应文件,添加flag:
- 打开ARC:-fobjc-arc
- 关闭ARC:-fno-objc-arc
ARC的修饰符
ARC主要提供了4种修饰符,他们分别是:__strong,__weak,__autoreleasing,__unsafe_unretained。
在IOS开发中,任何一个属性都有三个特性(@property后面可以跟三个关键字),每个特性都有多种可选类型
多线程特性
- atomic :原子的,表示线程安全,默认的
- nonatomic :非原子的,表示非线程安全
读写特性
- readwrite:编译器会为属性生成get方法和set方法,系统默认的
- readonly:编译器只生成get方法
内存管理特性
- strong 表示引用为强引用。对应在定义property时的"strong"。所有对象只有当没有任何一个强引用指向时,才会被释放。
- weak 表示引用为弱引用。对应在定义property时用的"weak"。弱引用不会影响对象的释放,即只要对象没有任何强引用指向,即使有100个弱引用对象指向也没用,该对象依然会被释放。不过好在,对象在被释放的同时,指向它的弱引用会自动被置nil,这个技术叫zeroing weak pointer。这样有效得防止无效指针、野指针的产生。__weak一般用在delegate关系中防止循环引用或者用来修饰指向由Interface Builder编辑与生成的UI控件。
适用范围【delegate 和 IBOutlet属性】
weak指针还可以解决强引用循环(strong reference cycle/retain cycle):当两个或两个以上对象之间互相强引用时,无法通过ARC来释放对象,可能会导致内存泄漏。解决办法是将其中一个指针改为weak。具体改哪一个,可以为存在强引用循环的对象决定父子关系。父对象应该使用具有强引用特性的指针指向子对象,子对象应该使用具有弱引用特性的指针指向父对象。 - unsafe_unretained:(不安全不引用)用于非对象属性(即:基本数据类型),这类属性不需要做内存管理,它表示存取方法会直接为实例变量赋值。【MRC时期使用assign】
【unsafe是相对于weak而言的。unsafed_unretained类型的指针指向的对象被销毁时,指针不会自动设置为nil,而是成为空指针,因此不安全。但是当处理非对象属性时是不会出现空指针问题的】
【unretained是指不会引起引用计数加1】 - autoreleasing 的英文解释为:to denote arguments that are passed by reference (id *) and are autoreleased on return,即主要是在引用传参时使用