background image

IOS 开发:

ARC 跟 block 那点事

 

block 是可以捕捉上下文的特殊代码块。
block 可以访问定义在 block 外的变量,当在 block 中使用时,它就会为其在
作用域内的每个标量变量创建一个副本。
如果通过

self 拥有一个 block,然后又在 block 中改变了实例变量,就会出错。

例如:
1 self.block = ^(NSString *aString)
2 {
3     self.aLabel.text = aString;
4 });
 

这段代码中,

self 保留了 block,同时 block 又保留了 self,会引发循环保留。

很危险。
如果未使用

ARC,可以使用__block 和__unsafe_unretained 来复制一个未保

留的引用副本。
 1 //例如:(无 ARC)
 2 __block id safeSelf = self;
 3 self.block = ^(NSString *aString)
 4 {
 5     safeSelf.aLabel.text = aString;
 6 });
 7  
 8 //(有 ARC)
 9 __weak id safeSelf = self;        //ios 5
10 // __unsafe_unretained id safeSelf = self; //ios 4
11 self.block = ^(NSString *aString)
12 {
13     safeSelf.aLabel.text = aString;
14 });
 

arc 出现之前,我们可以自由的把 CF*对象转成 NS*对象,这称为自己桥接。

用了

arc 之后,我们需要指定一个所有权转移修饰符。

目前

arc 中提供的修饰符有:

1.__bridge
2.__bridge_retained
3.__bridge_transfer
 
第一个修饰符

__bridge 是一个普通的转换,表示不需要增加引用计数,不更改

                   找软件资料,就到一览软件文库

http://wk.yl1001.com/rj/