block是可以捕捉上下文的特殊代码块。
block可以访问定义在block外的变量,当在block中使用时,它就会为其在作用域内的每个标量变量创建一个副本。
如果通过self拥有一个block,然后又在block中改变了实例变量,就会出错。
例如:
 self.block = ^(NSString *aString)
{
self.aLabel.text = aString;
});
这段代码中,self保留了block,同时block又保留了self,会引发循环保留。很危险。
如果未使用ARC,可以使用__block和__unsafe_unretained来复制一个未保留的引用副本。
 //例如:(无ARC)
__block id safeSelf = self;
self.block = ^(NSString *aString)
{
safeSelf.aLabel.text = aString;
}); //(有ARC)
__weak id safeSelf = self; //ios 5
// __unsafe_unretained id safeSelf = self; //ios 4
self.block = ^(NSString *aString)
{
safeSelf.aLabel.text = aString;
});
 
在arc出现之前,我们可以自由的把CF*对象转成NS*对象,这称为自己桥接。用了arc之后,我们需要指定一个所有权转移修饰符。
目前arc中提供的修饰符有:
1.__bridge
2.__bridge_retained
3.__bridge_transfer
 
第一个修饰符__bridge是一个普通的转换,表示不需要增加引用计数,不更改所有权。
第二个是在转换C指针类型时,增加引用计数的值。
第三个是把Core Foundation 指针类型转换成obj-c指针,变把引用计数值+1。如用Core Foundation 方法创建一个对象,并且要用arc来管理对象的内存,就可以用这个。
 
arc移植的常见错误
1.强制转换obj-c指针位C指针(或者反过来转换)
2.在arc中把void*指针强制转成id类型(或者反过来转),如果要转,就必须是用修饰符
例如: id selfPointer = (__bridge void *)self;
3.在结构体或者(union)集合体中是用obj-c对象
4.使用NSAutoreleasePool

ios高效开发二--ARC跟block那点事的更多相关文章

  1. ios高效开发--blocks相关

    1.替换delegate       如果我们有2个viewController,a和b,当我们从a界面push到b后,在b上面触发了一些事件,这些时间又会影响到a界面上的内容.            ...

  2. ios高效开发-正确的使用枚举(Enum)

    前言 Enum,也就是枚举,从C语言开始就有了,C++.Java.Objective-C.Swift这些语言,当然都有对应的枚举类型,功能可能有多有少,但是最核心的还是一个—规范的定义代码中的状态.选 ...

  3. iOS高效开发必备的10款Objective-C类库

    http://blog.csdn.net/yhawaii/article/details/7392988

  4. IOS基础开发二(iphone计算器)

    今天做了个iphone的小例子计算器:才用mvc设计模式 项目目录: 代码如下: CalculatorViewController:(MVC的控制器) // CalculatorViewControl ...

  5. iOS 非ARC基本内存管理系列 -手把手教你ARC——iOS/Mac开发ARC入门和使用(转)

    手把手教你ARC——iOS/Mac开发ARC入门和使用 Revolution of Objective-c 本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流 ...

  6. iOS开发 - OC - block的详解 - 深入篇

    深入理解oc中的block 苹果在Mac OS X10.6 和iOS 4之后引入了block语法.这一举动对于许多OC使用者的编码风格改变很大.就我本人而言,感觉block用起来还是很爽的,但一直以来 ...

  7. iOS开发-二维码扫描和应用跳转

    iOS开发-二维码扫描和应用跳转   序言 前面我们已经调到过怎么制作二维码,在我们能够生成二维码之后,如何对二维码进行扫描呢? 在iOS7之前,大部分应用中使用的二维码扫描是第三方的扫描框架,例如Z ...

  8. iOS应用开发:什么是ARC?

    iOS应用开发:什么是ARC? 博客分类: Phone / IOS / Objective-C / Swift   ARC是什么 ARC是iOS 5推出的新功能,全称叫 ARC(Automatic R ...

  9. iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2)

    iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2) 此时,当用户轻拍按钮后,一个叫tapButton()的方法就会被触发. 注意:以上这一种方式是动作声明和关联一起进行的,还有一种先 ...

随机推荐

  1. 洛谷 P3227 BZOJ 3144 [HNOI2013]切糕

    题目描述 经过千辛万苦小 A 得到了一块切糕,切糕的形状是长方体,小 A 打算拦腰将切糕切成两半分给小 B.出于美观考虑,小 A 希望切面能尽量光滑且和谐.于是她找到你,希望你能帮她找出最好的切割方案 ...

  2. 数据库--ACID特性

    事务的ACID属性 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生. 一致性(Consistency) 事务必须使数据库从一个一致性状态变换 ...

  3. C#--线程池与线程的种类

    .NET CLR线程的种类 至少3个线程:主线程.调试线程.终结器线程 1.main thread 2.worker thread 3.finalizer thread 4.debugger help ...

  4. [bzoj1001][BeiJing2006]狼抓兔子_网络流_最小割转对偶图

    狼抓兔子 bzoj-1001 BeiJing2006 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还 ...

  5. pt-kill--- MySQL数据库CPU飙升紧急处理方法

    MySQL数据库CPU飙升紧急处理方法 [日期:2014-01-22] 来源:Linux社区  作者:hcymysql [字体:大 中 小]       运行平稳的数据库,如果遇到CPU狂飙,到80% ...

  6. Struts简单介绍

    一.在介绍struts之前,先来了解一下什么是MVC框架吧. 1.MVC介绍 MVC全名是Model View Controller.是模型(model)-视图(view)-控制器(controlle ...

  7. ZOJ 3829 Known Notation(字符串处理 数学 牡丹江现场赛)

    题目链接:problemId=5383">http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5383 Do you ...

  8. xargs命令【转】

    本文转载自:http://man.linuxde.net/xargs

  9. bzoj2958: 序列染色&&3269: 序列染色

    DP这种东西,考场上就只能看命了.. #include<cstdio> #include<iostream> #include<cstring> #include& ...

  10. Softmax回归——logistic回归模型在多分类问题上的推广

    Softmax回归 Contents [hide] 1 简介 2 代价函数 3 Softmax回归模型参数化的特点 4 权重衰减 5 Softmax回归与Logistic 回归的关系 6 Softma ...