现在的位置: 首页 > 综合 > 正文

IOS block编程注意事项

2013年08月03日 ⁄ 综合 ⁄ 共 766字 ⁄ 字号 评论关闭

block可以完全作为delegatge的替代品,而且使用简单,不需要写太多@protocol来定义接口。但使用有以下几点注意。

(1) block不是Object对象,所以对retain无效,要想保留block生命周期,最好通过copy来实现,当然copy后,要记得release。如果不想手动管理,就通过[[[testBlock] copy] autorelease]来管理。

(2)我们知道一般被block的应用的对象,retainCount会自动加一,为了打破这种 retain circle,可以在对象前加__block,这样block块就不会维护这个对象了。有两种情况

(1)对临时变量的引用如:A  a =[ [[A alloc] init] withBlock:^{

 [a action];

     [ a release];

}];其实这样会导致内存泄漏,要打破这种circle,只需要在A前面加__block。在我的测试代码中,由于没有对A加__block 导致程序直接崩溃。








   

__block A  a =[ [[A alloc] init] withBlock:^{

 [a action];

     [ a release];

}]; 这样A的dealloc方法就会调用

(2)对实例变量的引用如

A  a =[ [[A alloc] init] withBlock:^{

 [self action];

}];这样即使调用的self 自身类的release 方法,只要这个block没有执行完,self也不会释放。要打破这种可采用如下做法

__block typeof (self) bself = self; 即通过表达式引用,具体参考typeof用法
,指明 bself 是self类型。

A  a =[ [[A alloc] init] withBlock:^{

 [bself action];

}];这样块和self相互独立了。

抱歉!评论已关闭.