一、使用block注意事项
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 导致程序直接崩溃。
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相互独立了。