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 是一个普通的转换,表示不需要增加引用计数,不更改
找软件资料,就到一览软件文库