今天碰到一群友問(wèn):為什么Block的循環(huán)引用 ,有時(shí)候需要處理有時(shí)候不需要處理?
個(gè)人認(rèn)為Block之所以會(huì)造成循環(huán)引用的問(wèn)題是??
ViewController(self) 持有了block的對(duì)象? block中也持有當(dāng)前的viewController 導(dǎo)致了循環(huán)引用炬灭。self對(duì)象將不會(huì)被銷(xiāo)毀抱慌,從而block也不會(huì)被銷(xiāo)毀屎飘,引起內(nèi)存泄露。
解決方法:(1)從block方面處理
在block外部使用__week ?或者_(dá)_block來(lái)處理
(2)從ViewController方面處理 ?例如:
若在ViewController的viewDidLoad加入下方的代碼态蒂,是不會(huì)導(dǎo)致循環(huán)引用的。因?yàn)榇a塊是類(lèi)方法娘汞,ViewController沒(méi)有持有該部分內(nèi)存漫仆。當(dāng)block執(zhí)行結(jié)束后,block就會(huì)被釋放掉坤按,因而self就不會(huì)被持有。
[UIView animateWithDuration:0.5 animations:^{
[self testPrint];
}];
//內(nèi)部@weakify? @strongify(self);
@weakify(self);
[self.viewModel.updateContentSignal subscribeNext:^(id x) {
@strongify(self);
[self.tableView reloadData];
self.headerView.model = self.viewModel.featureModel;
}];
使用過(guò)RAC的同學(xué)應(yīng)該都知道@weakify和@strongify馒过,這兩個(gè)宏在RAC中是已經(jīng)定義好的臭脓,可以直接用,屬于比較牛逼的寫(xiě)法腹忽。這兩個(gè)宏一定成對(duì)出現(xiàn)来累,先@weakify再@strongify.可以很好的管理Block內(nèi)部對(duì)self的引用【阶啵可以一步步點(diǎn)開(kāi)發(fā)現(xiàn)其實(shí)使用到了C語(yǔ)言中的組合運(yùn)算符嘹锁。