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;

  };

IOS6学习笔记(三)的更多相关文章

  1. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  2. [Firefly引擎][学习笔记三][已完结]所需模块封装

    原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读:        笔记三主要就是各个模块的封装了,这里贴 ...

  3. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  4. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  5. VSTO学习笔记(三) 开发Office 2010 64位COM加载项

    原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...

  6. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

  7. NumPy学习笔记 三 股票价格

    NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...

  8. Learning ROS for Robotics Programming Second Edition学习笔记(三) 补充 hector_slam

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  9. Learning ROS for Robotics Programming Second Edition学习笔记(三) indigo rplidar rviz slam

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  10. Typescript 学习笔记三:函数

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

随机推荐

  1. Ubuntu 中搭建 LAMP 及 php 开发工具

    所谓 LAMP,指的是:Linux+Apache+Mysql+Php 仅以此文做一个备忘录 Step1. 安装 Apache 1. 在 terminal 中输入一下命令并执行: sudo apt-ge ...

  2. python网站收集

    1.python核心编程 习题答案    http://www.cnblogs.com/balian/category/279009.html 2.编程语言入门经典100例(python版)  htt ...

  3. Ubuntu桌面版本和服务器版本之间的区别(转载)

    转载自:http://blog.csdn.net/fangaoxin/article/details/6335992 http://www.linuxidc.com/Linux/2010-11/297 ...

  4. nginx后的tomcat获取真实用户ip

    目前大部分获取ip的方式:beat.getRequest().getRemoteAddr()但是,如果通过nginx反向代理的话,就获取不到真实ip,是获取的nginx的ip 需要:添加    pro ...

  5. 让我们一起Go(十三)

    前言: 上篇,我们了解了Go语言接口的一些知识,在这篇中,我们将继续聊聊接口这东西. Go语言空接口 Go语言中定义一个空接口,也就是没有任何函数需要实现的接口就是一个空接口,作为一个空接口,因为对象 ...

  6. 从头学Qt Quick(1) --体验快速构建动态效果界面

    自2005年Qt4发布以来,Qt已经为成千上万的应用程序提供了框架服务,现在Qt已经基本上支持所有的开发平台了,这里面既包含了桌面.嵌入式领域,也包括了Android.IOS.WP等移动操作平台,甚至 ...

  7. 字符集与Mysql字符集处理(一)

      一.字符集总结 其实大多数的知识在这篇文章里已经讲得非常清楚了.这里只是讲一下自己的感悟. 1. UTF-8虽然是以UTF(unicode transfermation format)开头的,但是 ...

  8. 关于异步Promises

    英文原文:What's The Point Of Promises? 迄今为止,可能每个JavaScript开发者和他们的祖母都听说过Promises.如果你没有,那么你即将会.promises的概念 ...

  9. 从零开始Grunt

    [20141025]从0开始Grunt *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom ...

  10. DDD:如何表达聚合之间的关系?

    大家都能达成的两个共识是: 概念模型中,聚合之间充满着关系(双向). 对象模型中,根据有用性.性能和成本等因素考虑,保留某些必须的关系. 备注:读写分离有利于更好的表达关系,因为某些关系在读取的时候需 ...