好比这样一个Block类型:安全
@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];
在ARC下,因为__block抓取的变量同样会被Block retain,因此必须用弱引用才能够解决循环引用问题,iOS 5以后能够直接使用__weak,以前则只能使用__unsafe_unretained了,__unsafe_unretained缺点是指针释放后自 己不会置空。示例代码:atom
//非ARC __block typeof(self) weakSelf = self; self.myBlock = ^(int paramInt) { //使用weakSelf访问self成员 [weakSelf anotherFunc]; };