1.ARC空声明变量

  使用ARC的另一个优势是所有未初始化的变量默认都是“空值化”的。这意味着像下面这样的声明使用ARC编译后指向的是空值(nil):

  NSObject myObject1,myObjects2;

  不过要注意的是,与其他高级编程语言不同,ARC不会自动将标量的值设置为零。

  这意味着以下几行代码声明的变量其值并不等于零:

  int a;

  int b;

2.Objective-C命名约定

  如果你在Person对象中写了一个叫做newPersonName的方法,ARC会认为该方法返回一个分配过的对象。使用ARC(或者不适用ARC)编译过的调用代码和方法newPersonName运行时一切正常。但是如果这一方法所在的类没有使用ARC编译而调用方法使用了ARC编译,程序就会奔溃。反过来,如果newPersonName方法是使用ARC编译的而调用代码没有,就会出现内存泄露。

3.覆盖默认行为

  虽然从技术上说我们无法覆盖LLVM的行为,但还是可以使用Clang源标注NS_RETURNS_RETAINED和NS_RETURNS_NOT_RETAINED来更改方法。newPersonName方法可以像下面这样标注,以告诉ARC编译器:尽管该方法名称前面是new,返回的却是未保留过的对象指针。

  -(NSString *)newPersonName NS_RETURNS_NOT_RETAINED;

4.自由桥接

  与Objective-C库不同,我们在Objective-C中使用的标准C语言和Core Fundation类库(CF 方法)不会遵循那些命名约定。这意味着ARC编译器无法百分百地释放不需要的内存。在ARC出现之前,我么可以将CF对象强制转变成NS对象,这称为自由桥接(toll-free bridging)。也就是说,我们可以将CFString通过类型转换变成NSString*类型。而有了ARC,我们便无法再这么做了,至少不指定一个所有权转移修饰符时确实如此。

  ARC允许使用一下这些所有权转移修饰符:

  __bridge

  __bridge_retained

  __bridge_transfer

  1.__bridge

  它告诉ARC不要增加它的引用计数的值,也不要更改所有权。

  2.__bridge_retained

  若想要转换C指针类型并增加引用计数的值,我们可以使用第二个修饰符。当要从Objective-C方法(它创建一个Core Fundation对象并在之后使用CFRelease方法将其释放)返回一个保留过的指针时,我们可以使用这个修饰符。如果Objective-C方法属于NSRETURNS_RETAINDED系列,就要返回保留过的指针。

  3.__bridge_transfer

  如果要将Core Fundation指针类型转换成Objective-C指针并为引用计数加1,可以使用最后一个修饰符。若Core Fundation方法创建一个对象,并且想要靠ARC来管理对象的内存,我们便可以使用这个修饰符。

5.忽略performSelector警告

  #pragma clang diagnostic push

  #pragma clang diagnostic ignored "-Warc-performSelector-leaks"

            [uiViewController performSelector:finishMethod withObject:request];

  #pragma clang diagnostic pop

6.block引起的循环保留

  使用__block避免循环保留(无ARC)

  __block id safeSelf = self;

  self.myBlock = ^(NSString* returnedString){

  safeSelf.labelControl.text = returnedString;

  };

  ARC会改变__block的语义,因此不应该使用它。在ARC中,__block引用会被保留而不是被复制,这意味着在ARC环境中前面的代码仍然会引发循环保留。正确地方法是使用__weak或(__unsafe_unretained)引用,如:

  

  使用__weak避免循环保留(有ARC)  

  __weak typeof(self) safeSelf = self;//IOS 5+

  //__unsafe_unretained typeof(self) safeSelf = self;//IOS 4+

  self.myBlock = ^(NSString* returnedString){

  safeSelf.labelControl.text = returnedString;

  };

原来在ARC下还有这么多不同?!的更多相关文章

  1. 关于ARC下需要dealloc的相关内容

    今天在项目中使用KVO添加观察者模式的时候,在返回上一级的时候竟然崩了.可是,看了很久,代码没有问题.最后,终于知道了需要添加dealloc 防止以后再出错,所以,便纪录下来.关于ARC下需要手动释放 ...

  2. ARC下内存泄露问题

    ARC下内存泄露问题 ARC下内存泄露问题,有需要的朋友可以参考下. iOS提供了ARC功能,很大程度上简化了内存管理的代码. 但使用ARC并不代表了不会发生内存泄露,使用不当照样会发生内存泄露. 下 ...

  3. block 在ARC和非ARC下的不同含义

    Block的循环引用 对于非ARC下, 为了防止循环引用, 我们使用__block来修饰在Block中使用的对象: 对于ARC下, 为了防止循环引用, 我们使用__weak来修饰在Block中使用的对 ...

  4. iOS ARC下dealloc过程及.cxx_destruct的探究

    前言 这次探索源自于自己一直以来对ARC的一个疑问,在MRC时代,经常写下面的代码: 1 2 3 4 5 6 7 8 9 - (void)dealloc {     self.array = nil; ...

  5. iOS: ARC和非ARC下使用Block属性的问题

    1. Block的声明和线程安全 Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非AR ...

  6. __block在ARC和非ARC下有什么不同

    一般在block中修改变量都需要事先加block进行修饰.在非arc中,block修饰的变量的引用计算是不变的.在arc中,会引用到,并且计算+1:非arc下可使用(arc直接使用__weak即可) ...

  7. ARC下需要注意的内存管理

    ARC下需要注意的内存管理 2016/04/03 · iOS开发 · 内存管理 分享到:1 原文出处: 一不(@luoyibu)    之前发了一篇关于图片加载优化的文章,还是引起很多人关注的,不过也 ...

  8. 理解 ARC 下的循环引用

    本文由 伯乐在线 - nathanw 翻译,dopcn 校稿.未经许可,禁止转载!英文出处:digitalleaves.com.欢迎加入翻译组. ARC 下的循环引用类似于日本的 B 级恐怖片.当你刚 ...

  9. ARC下的block导致的循环引用问题解析

    ARC下的block导致的循环引用问题解析 更详细细节请参考 http://blog.sina.com.cn/s/blog_8c87ba3b0101m599.html ARC下,copy到堆上的blo ...

  10. Block 在 ARC 下的拷贝

    前言 现在有一种说法,是开启arc选项时,已经没有栈上的block了,所以所有的block都不需要copy来拷贝到堆上了.那么这个说法正确与否呢? 结论是这个说法必须是错误的,首先的一点就是arc只是 ...

随机推荐

  1. java方法:flush()

    flush本意是冲刷,这个方法大概取自它引申义冲马桶的意思,马桶有个池子,你往里面扔东西,会暂时保存在池子里,只有你放水冲下去,东西才会进入下水道. 同理很多流都有一个这样的池子,专业术语叫缓冲区,当 ...

  2. HDU 1495 非常可乐 BFS

    题目大意:中文题不说了. 题目思路:我有同学用GCD数论写出来的代码很简洁,但是很抱歉,数论蒟蒻,我觉得比赛的时候我没办法推出.如果用BFS的话思路很简单的,就是6方向广搜,只不过稍微麻烦点.具体看代 ...

  3. new thoughts over function pointers

    Previous works do not relate to function pointers, but reading some documents reading and learning S ...

  4. UVA 10200 Prime Time (打表)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  5. 从内存溢出看Java 环境中的内存结构(转)

    作为有个java程序员,我想大家对下面出现的这几个场景并不陌生,倍感亲切,深恶痛绝,抓心挠肝,一定会回过头来问为什么为什么为什么会这样,嘿嘿,让我们看一下我们日常在开发过程中接触内存溢出的异常: Ex ...

  6. 如何用好 Google 搜索引擎?

    1.双引号 把搜索词放在双引号中,代表完全匹配搜索,也就是说搜索结果返回的页面包含双引号中出现的所有的词,连顺序也必须完全匹配.bd和Google 都支持这个指令.例如搜索: “seo方法图片” 2. ...

  7. MVC 使用Jquery的$.post传递参数

    MVC中,如果要使用 $.post 给 COntroller 传递参数,需要类实现 属性 get set,这样才行

  8. EL表达式,保留小数点后两位

    你遇到过页面显示小数有9.987870488E9这个吗? 这是因为没有保留小数的原因 有时候用js保留小数很麻烦的时候,可以用EL表达式 <fmt:formatNumber type=" ...

  9. Safari WebApp 模拟 原声APP禁止打开新窗口JS代码

    if(("standalone" in window.navigator) && window.navigator.standalone) { var noddy, ...

  10. javascript 之Function对象的apply(),call(),bind(),方法和arguments,caller,length属性

    注:这篇文章原文:http://www.jb51.net/article/30883.htm 自己作为学习,重新写写. 一.写在前面的话 前端javascript编程还只是略懂皮毛,DOM知道一点,j ...