最近在做項(xiàng)目的時(shí)候遇到 block 中對(duì)象循環(huán)引用的問(wèn)題苹支。 發(fā)現(xiàn)自己對(duì) block 還不是特別深入, 有時(shí)間對(duì) block 進(jìn)行下總結(jié)回顧。
當(dāng)時(shí)代碼是這樣的:
-(void)addProgressView
{
AVPlayerItem *playerItem = self.player.currentItem;
[self.player addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 1.0) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){
float current = CMTimeGetSeconds(time);
float total = CMTimeGetSeconds([playerItem duration]);
self.progressSlider.maximumValue = total;
self.progressSlider.value = current;
}];
}
出現(xiàn)警告是:
capturing 'self' stringly in this block is likely to lead to a retain cycle
block 循環(huán)引用
block 中會(huì)對(duì)引用的對(duì)象進(jìn)行retain (引用計(jì)數(shù) + 1), 該操作對(duì)象又將retain 該 block,從而導(dǎo)致相互retain引起循環(huán)引用,它們將永遠(yuǎn)不會(huì)被釋放。并且造成內(nèi)存泄漏。
解決方法:
MRC : 在 block 外,把 self 轉(zhuǎn)換一下加上 __block
字段之后就不會(huì)被 retain 了;MRC 中不能使用__ weak
ARC : 在 block 外,把 self 轉(zhuǎn)換一下加上 __weak
字段之后就不會(huì)被 retain 了; ARC 中 __block使用無(wú)效