__block在arc和非arc下含义同样吗?

Block属性的声明,首先须要用copy修饰符,由于只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,能够参考以前的文章(iOS: 非ARC下返回Block)。

 

好比这样一个Block类型:安全

typedef void (^MyBlockType)(int);

 

@property (copy) MyBlockType myBlock; 

 

 

if (self.myBlock) {  //此时,走到这里,self.myBlock可能被另外一个线程改成空,形成crash  //注意:atomic只会确保myBlock的原子性,这种操做自己仍是非线程安全的  self.myBlock(123); } 

 

 

MyBlockType block = self.myBlock; //block如今是本地不可变的 if (block) {  block(123); } 

 

//ARC MyBlockType block = [self.myBlock retain]; if (block) {  block(123); } [block release]; 

 

 

返回目录 2. 循环引用问题

在ARC下,因为__block抓取的变量同样会被Block retain,因此必须用弱引用才能够解决循环引用问题,iOS 5以后能够直接使用__weak,以前则只能使用__unsafe_unretained了,__unsafe_unretained缺点是指针释放后自 己不会置空。示例代码:atom

//iOS 5以前能够用__unsafe_unretained //__unsafe_unretained typeof(self) weakSelf = self; __weak typeof(self) weakSelf = self; self.myBlock = ^(int paramInt) { //使用weakSelf访问self成员 [weakSelf anotherFunc]; };

 

 

//ARC __block typeof(self) weakSelf = self; self.myBlock = ^(int paramInt) {  //使用weakSelf访问self成员  [weakSelf anotherFunc]; }; 
相关文章
相关标签/搜索