__block typeof的说明

1. block不是Object对象,所以对retain无效,要想保留block生命周期,最好通过copy来实现,当然copy后,要记得release。

2.一般被block的应用的对象,retainCount会自动加1,为了解决这种 retain的内存问题,可以在对象前加__block,如果不加会导致内存泄漏,导致程序直接崩溃。加了block块就不会维护这个对象了。

对临时变量的引用:

__block Object obj = [[[Object alloc] init] withBlock:^{

    [obj blockRetain];

    [obj release];

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

 对实例变量的引用:

Object obj =[[[Object alloc] init] withBlock:^{

   [self blockRetain];

}];

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

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

Object obj =[[[Object alloc] init] withBlock:^{

 [bself blockRetain];

}];

这样块和self相互独立了。

原文地址:https://www.cnblogs.com/wangshengl9263/p/3470992.html