好比這樣一個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]; };