IOS block编程注意事项

本文转自-sgl870927

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值