block迴圈引用解決

2021-09-23 12:29:35 字數 1582 閱讀 7392

@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...