__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]; }; 
相關文章
相關標籤/搜索