基于简化开发的思想来看,ARC绝对是一个没理由拒绝的技术进步。

ARC随着iOS5问世,到现在的iOS8,你还在手动写retain,release么?除了固守思想外,对ARC的恐惧大都来自对它的未知。

比如我在公司尝试说服team使用ARC时被质疑的几个问题:

ARC和Java的GC一样,会导致一部分性能损耗?

首先,ARC和GC是两码事,ARC是编译时编译器“帮你”插入了原本需要自己手写的内存管理代码,而非像GC一样运行时的垃圾回收系统。

ARC内存不知道什么时候释放,导致不可控的内存涨落?

了解ARC的原理后,就知道,ARC下编译器插入的内存管理的代码是经过优化的,对于使用完的内存,多运行一行代码都不会浪费,可以这么说,手写的内存管理必须达到很严谨的水平才可能达到ARC自动生成的一样完整且没有疏漏。

ARC下面自己不管理内存,很不爽,很没有安全感。

这纯粹是习惯的问题了,开发者的目标是用最简化的手段完成一个最可靠的程序,进步需要改变的。好在编译选项中提供了-fobjc-arc和-fno-objc-arc来保证整个的变革的继续下去,就像社会主义中国里的港澳。

ARC的约定

使用ARC之后一个费解的地方是,一个方法生成的对象,没有任何附加标示,ARC怎么知道生成的对象是不是autorelease的呢?

  1. @interface Sark : NSObject
  2. + (instancetype)sarkWithMark:(NSString *)mark; // 1
  3. - (instancetype)initWithMark:(NSString *)mark; // 2
  4. @end

这是非ARC时常用的手段,1、生成autorelease对象,2、生成普通对象,而现在ARC不能调用autorelease,使用时怎么能知道呢?

  1. {
  2. // ...
  3. Sark *sark1 = [Sark sarkWithMark:@"萨萨萨"];
  4. Sark *sark2 = [[Sark alloc] initWithMark:@"萨萨萨"];
  5. }

使用约定,NS定义了下面三个编译属性

  1. #define NS_RETURNS_RETAINED __attribute__((ns_returns_retained))
  2. #define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))
  3. #define NS_RETURNS_INNER_POINTER __attribute__((objc_returns_inner_pointer))

这三个属性是Clang自己使用的标示,除非特殊情况不要自己使用,但是这些对理解ARC是很有帮助的。

这里还要介绍一个概念,Method family:

An Objective-C method may fall into a method family, which is a conventional set of behaviors ascribed to it by the Cocoa conventions.

指的是命名上表示一类型的方法,比如- init和- initWithMark:都属于init的family

于是乎,编译器约定,对于alloc,init,copy,mutableCopy,new这几个家族的方法,后面默认加NS_RETURNS_RETAINED标识;而其他不指名标识的family的方法默认添加NS_RETURNS_NOT_RETAINED标识

也就是说刚才的方法,在编译器看来是这样的:

  1. @interface Sark : NSObject
  2. + (instancetype)sarkWithMark:(NSString *)mark NS_RETURNS_NOT_RETAINED; // 1
  3. - (instancetype)initWithMark:(NSString *)mark NS_RETURNS_RETAINED; // 2
  4. @end

这也就是为什么ARC下面,不能把一个属性定义成名字是这样的:

  1. @property (nonatomic, copy) NSString *newString; // 编译器不允许

- newString就成了new家族的方法,内存就不对了

对于NS_RETURNS_INNER_POINTER这货,主要使用在返回的是一个对象的内部C指针的情况,如NSString的方法:

  1. - (__strong const char *)UTF8String NS_RETURNS_INNER_POINTER;

转载于:https://www.cnblogs.com/wfwenchao/articles/4291924.html

iOS 对arc的一点深入理解相关推荐

  1. AngularJS』一点小小的理解

    『AngularJS』一点小小的理解 AngularJS 是一个前端的以Javascript为主的MVC框架.与AngularJS相类似的还有EmberJS. 随着时代在进步,各种各样的开发理念与开发 ...

  2. 事件与委托的一点概念理解

    事件与委托的一点概念理解 早就接触过delegate和event,但是始终是一知半解,今天刚好有机会就好好研究一下! Delegate 顾名思义就是委托,委托的意思就是麻烦别人帮我干些事情.比如,我要 ...

  3. iOS开发ARC内存管理技术要点

    本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节.这篇 ...

  4. iOS开发ARC入门和使用

    本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流和讨论.请不要将本文的部分或全部内容用于商用,谢谢合作. 欢迎转载本文,但是转载请注明本文出处:http:/ ...

  5. iOS开发ARC内存管理

    本文的主要内容: ARC的本质 ARC的开启与关闭 ARC的修饰符 ARC与Block ARC与Toll-Free Bridging ARC的本质 ARC是编译器(时)特性,而不是运行时特性,更不是垃 ...

  6. iOS 下ARC的内存管理机制

    本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节.这篇 ...

  7. [iOS]-NSTimer与循环引用的理解

    目录: 参考的博客: 问题引入 循环引用 简单的循环引用 Block中的循环引用强弱共舞 Delegate中的循环引用 NSTimer 创建NSTimer 销毁NSTimer invalidate f ...

  8. IOS学习——ARC初识

    本文转载自吴茜的转载,由于原文链接失效,出处写为该美女的链接:http://blog.csdn.net/yiyaaixuexi/article/details/7351104 ARC是什么 ARC是i ...

  9. IOS之block,一点小心得

    作为一个iOS开发程序员,没用过block是不可能的.这次我探讨的是block原理,但是有些更深层次的东西,我也不是很清楚,以后随着更加了解block将会慢慢完善. 第一个问题,什么是block? 我 ...

最新文章

  1. Vivado如何计算关键路径的建立时间裕量?(实践篇)
  2. bzoj 1877: [SDOI2009]晨跑 (网络流)
  3. 你不会真的以为自己懂得计算机网络吧?
  4. 怎样对ZBrush中的材料进行渲染和着色
  5. axios,vue-axios在项目中的应用
  6. pb 执行存储过程带参数_PB级海量数据服务平台架构设计实践
  7. 不同维度的矩阵相乘的时间复杂度
  8. OpenCV之图像梯度(笔记11)
  9. 移动加权平均全月平均
  10. 揭秘让您正确识别和处理恶意邮件的五种方法
  11. uVision2项目实践:HelloWorld
  12. Micaps3.2二次开发实例教程-11
  13. vue-elemnt-admin npm run dev 运行报错
  14. 22计算机考研上岸个人经验近万字分享(11408初试360分)
  15. 通过RViz中的InteractiveMarkers在ROS中仿真力和力矩(wrench.force和wrench.torque)
  16. GMT绘制子图、指北针、图例、比例尺
  17. 从Masonry 源码探 Objective-C [源码学习开篇]
  18. X12季节调整在matlab上的实现
  19. Flash/Flex/AIR:Flex简介
  20. CSS实现背景图片垂直居中定位2种方法

热门文章

  1. TCP、UDP(网络协议:传输层协议)
  2. 深度学习与TensorFlow:VGG论文复现
  3. 深度学习算法 | LSTM算法原理简介及Tutorial
  4. 导出库的版本_了解 JavaScript 模块系统基础知识,搭建自己的库
  5. python 大众点评模拟登陆_python项目实战:模拟登陆163邮箱,简单到爆
  6. python使用kafka原理详解真实完整版_史上最详细Kafka原理总结
  7. 06软件构架实践阅读笔记之六
  8. 【转】博客园中应用LaTex进行公式编写
  9. 解说linux下proc文件系统
  10. Silverlight4Beta之与剪切板通信