@inte***ce viewcontroller ()
@property (nonatomic, strong) testnetworkblock *testnetwork;
@end
@implementation viewcontroller
(void)viewdidload
@end
@inte***ce testnetworkblock ()
@property (nonatomic, strong) nsstring *strtest;
@end
@implementation testnetworkblock
(id) init
);};}
return self;
}
(nsstring *) zhixing:(int) i
(void) ceshi
(void) dealloc
@end
多執行緒呼叫,block外面宣告了weakself,則block內部對self的引用為指標引用,當外部[self.testnetwork release], self.testnetwork = nil;時,weakself為nil,所以導致執行失敗。
_countblock = ^(int i));
};
_countblock為self物件,self強引用了_countblock,同時_countblock又怕裡面self釋放,所以block體裡面會強引用self。導致迴圈引用,記憶體一直不會被釋放,dealloc也不會被呼叫。
__weak testnetworkblock *weakself = self;
_countblock = ^(int i));
};
在 block 之前定義對 self 的乙個弱引用 wself,因為是弱引用,所以當 self 被釋放時 wself 會變為nil;
在block體內部宣告乙個強引用物件bself指向該wself。bself只會在block內部執行完畢才會消亡,這樣就保證了self物件被外部其他執行緒釋放掉的情況。又避免了迴圈引用,因為在block執行完,會釋放掉bself。
block 迴圈引用
結論 block作為成員變數,內部引用self的成員變數,必須使用self 弱引用 block作為區域性變數,無論怎樣寫,都不會對self造成強引用 block為變數 1 block為成員變數 typedef nsstring blockcc void inte ce twoviewcontroll...
block迴圈引用
底層原始碼 typedef void ghblock void struct main block impl 0 static void main block func 0 struct main block impl 0 cself static void main block copy 0 st...
BLOCK迴圈引用
何時block才會迴圈引用 為什麼block會迴圈引用 我們很多行為會導致block的copy,而當block被copy時,會對block中用到的物件產生強引用 arc下 或者引用計數加一 mrc下 如下 property nonatomic,readwrite,copy completionblo...