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相互独立了。