hello!大家好,我是来自北京的一枚iOS开发工程师!
-
这是我第一次写简书,可能有些low,边学markdown边写的,希望大家不要介意哦!好啦,进入主题。
-
今天在项目中遇到了两个问题,而且比较尴尬,两个问题都是内存泄露的原因,永远想象不到CPU高达110%是什么概念,话不多说直接上图
FE547C5B-50CE-4D68-B701-05A5CDC7344A.png -
是不是非常的可怕,看到这种情况我当时就懵了,表示第一次遇到呀,过程是艰辛的,但是结果还是美好的,经过三个小时的努力,终于解决了这个作为程序员不能忍的问题。
问题所在
-
初步判断是内存泄露,但是当时页面上的处理比较多,页面里面涉及到蓝牙写入、读取、上传,所以只是初步做了个判断,开始我以为是写的代理方法造成循环引用,各种检查代码,代理并没有错,后来实在找不到问题所在,只好把代码全部注释掉,一点点放开,终于找到问题,是因为页面上两个view 的切换并且两个view都有动画,一个UIView的动画,一个是CALayer层的动画组。
C058C176-CB12-411B-885E-B587243A170C.png
- 大家可以清晰的看到,在这里我是无限去循环调用动画(项目需求,没有办法啦)其实我这里已经改成了wself,因为我开始想的是这里造成了循环引用,可是__weak修饰后,跳转页面后内存还是暴涨,我的理解是用__weak修饰self后应该是弱引用,那么跳转页面后,当前block应该被销毁,但是程序告诉我,并没有销毁,既然这种方法不行,那我就换个方法吧! 83A7F1FE-B85D-4B33-852E-958D4E61CDBC.png
- 我定义一个BOOL值的成员变量,默认为Yes,思路是这样的,如果BOOL = Yes 的话 就让他去执行当前动画,如果为NO,直接return。然后commadn+r 测试程序,完美解决,当然了,这只是解决问题的一个方法,可能还有更好的方法,我并没有想到,如果有大神路过,有更高的办法,可以提出来。
- 第二个问题也是动画的问题,是CALayer的动画组,离开页面也是没有释放内存,造成内存泄露。 3974EE55-EDAA-4CFD-8228-2D5AE0BFAA6A.png 727DDE2C-B91E-4925-8CE3-91D05A1F895A.png
-
上面所示两张图片,是我创建以及释放,但是跳转页面的时候,内存也是暴涨,后来想明白,因为我的layer是加在view 层,移除的时候是移除_layer的成员变量,其实这个逻辑是不对的,正常的逻辑是从哪添加的就从哪移除(这个是我犯的比较低级的一个错误)然后
17C81290-127B-4BD0-BBE9-54629FBB1AFF.png
换成这句话就OK了,这个逻辑就对啦,这也是今天在项目中遇到的问题,晚上感觉思路不够写不成代码,还是巩固一下今天所学到的东西。
总结:
- 为什么动画会造成内存泄露呢,举个比较简单的例子,因为咱们知道layer是加在View上的,当页面消失的时候,控件已经被释放,但是layer没有释放,导致找不到控件,会一直调用,最后造成死递归(个人理解孩子找不到爸爸了)所以会造成内存泄露。
- 其实在项目中遇到的问题还是比较多的,今天躺在床上无聊,顺便写一写,时常给自己提个醒,以后不要犯这种低级的错误,以后只要有时间,我感觉还是应该多总结,因为只有总结多了,自己才会成长的快,虽然我目前是个小白,但是我也有一颗大神梦, 哈哈!好了,时间不早了,今天就说这么多,希望各路大神走过路过,看到写的不好的地方,多多提出意见和建议。大家晚安~~!
网友评论