从MRC到ARC

从JAVA转到IOS开发,接触的不知道是多少年前的OC代码,还是MRC的,结果就悲剧了,各种痛苦。然后用MRC写了大半年,终于忍受不了,学习一下ARC,提高一下编程的效率。

ARC的开启和关闭


如果需要对特定文件开启或关闭ARC,可以在工程选项中选择Targets -> Build Phases -> Compile Sources,在里面找到对应文件,添加flag:

  • 打开ARC:-fobjc-arc
  • 关闭ARC:-fno-objc-arc
Paste_Image.png

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,即主要是在引用传参时使用
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容