美文网首页ios developers
iOS常见内存泄露汇总

iOS常见内存泄露汇总

作者: yx_yang | 来源:发表于2022-07-31 16:56 被阅读0次

    一.定时器 NSTimer CADisplayLink

    原因:VC或View持有该控制器,同时传入self作为定时器的target,此时定时器内部也会持有这个self.

    例如:

    如果需求无主动停止定时器的情况,直接在dealloc中停止定时器.这种情况比较危险,易造成循环引用,定时器和控制器都无法释放.

    解决:可以使用3种方式

    1.使用IKWeakTimer类方法创建NSTimer定时器,内部已做弱引用处理

    [IKWeakTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES]

            2.target使用WeakProxy

    3.使用block方法,在block中处理事件

    二.传入控制器作为某个类的参数属性(或是某一个其他类型对象),同时这个类又是这个控制器(或是其他类型的对象)的属性,并且两处都是用strong修饰的

    原因:互相持有,在控制器退出后就无法释放

    例如:

    外部传入的viewController作为IKPhotoDelegeteModel的属性,且为strong修饰

    IKPhotoDelegeteModel在外部创建的时候也为作为外部ViewController的属性,同为strong修饰

    解决:可以根据需求对其中一个使用weak修饰

    三.持有了一个单例对象的某个属性,造成无法释放,但不是循环引用

    解决:谨慎使用或使用时复制一份

    四.动画中使用CAAnimation动画没有移除动画导致内存泄露

    原因:

    CAAnimation的delegate系统是使用strong修饰符的,猜测是系统为了确保动画完成之前动画加载的View不会被提前释放,所以在动画结束之后必须

    及时在动画结束的地方或是在其他地方手动移除动画

    五.使用weak_self有遗漏

    例如:

    如果使用了weakify(self),又没有使用strongify(self),下方应该使用weak_self,检查是否有遗漏

    例如:

    weakify对象使用错误 此处造成循环引用的是alert  应该使用weakify(alert)

    注意weakify和strongify的使用场景,一般情况下,如果需要确保block返回时self不被提前释放继续执行,需要多次使用[self xxxxx],需要使用strongify;如果是一个页面

    销毁了,可以不再继续执行block中代码的情况,可以不用strongify修饰,因为没有必要继续执行[self xxxxxx];

    如果是两个block循环嵌套,需要使用两层weakify和strongify

    六:使用window不当导致的内存泄露

    香芋在Bugly上发现了大量iOS9系统下的崩溃,崩溃信息无法明显看出具体原因。

    查看操作路径后发现基本都是有进行window的操作。

    使用真机调试后(iPhone4s iOS9)后,通过内存图发现window引起了内存泄露

    dismiss里面手动释放一下

    相关文章

      网友评论

        本文标题:iOS常见内存泄露汇总

        本文链接:https://www.haomeiwen.com/subject/rwijnttx.html