iOS自动检测循环引用(Retain Circle)

我们经常在书写代码过程中使用到block。

typedef <#returnType#>(^<#name#>)(<#arguments#>);

block是把双刃剑,用的好了可以减少代码书写,使代码简单明了,用不好反而会照成循环引用(Retain Circle),使内存无法释放,在书写中难免会遇到这种问题。那么我们怎么避免这种问题呢。

我在工作之余,写了一个简单的循环引用(Retain Circle)自动检测的代码,原理也很简单:定时扫描VC的parentViewControllerpresentingViewController,如果发现他们都为空,说明这个VC被系统释放掉了,我们就检查它释放还存在,如果还存在,说明它在其他地方被引用了,这个时候就要怀疑是循环引用(Retain Circle)了。

但是有一种情况特殊。

[UIApplication sharedApplication].delegate.window.rootViewController

当这个恰好是自己的时候,就要排除在外。

当然我们还有排除系统的VC,例如UIAlertView

NSBundle *mainB = [NSBundle bundleForClass:[vc class]];
if (mainB == [NSBundle mainBundle]) {
    vc.xy_exsit = YES;
    [vc xy_startCheck];
}

这样就可以了。用法详见地址(github)

iOS自动检测循环引用(Retain Circle)_第1张图片
演示图片

你可能感兴趣的:(iOS自动检测循环引用(Retain Circle))