我厂的App长时间使用后,有闪退的情况发生,估计是有内存泄露导致App被系统杀死。用Instruments查看后发现的确有内存泄露发生。
第一处如下图:
这是因为使用了第三方视频播放SDK造成的,原因不明。暂时搁置
更新:这个是因为播放的视频文件格式为.mp4,AVPlayer播放的时候就内存泄露,怀疑是视频文件本身有问题,尝试使用Quicktime转换为.mov时,发生错误,不能转换成功。后面将.mp4改为.mov格式,内存泄露消失。
真正诡异的内存泄露如下图:
所有泄露都是发生在系统框架。我直接就懵逼了,google了一圈,发现很早之前Apple系统框架的确有内存泄露,但都好多年了,早应该修复了啊。
回到我们的App,排查到内存泄露的地方,发现代码没有问题。就是很多个UILabel显示而已,再仔细看内存泄露的截图,发现很多泄露都和attributedstring有关系,但代码里面根本就没有使用这个。最后在xib里面发现有部分UILabel设置了attribute属性,如下图:
而在实际代码里面,根本没有使用UILabel的attributedText属性,都是直接赋值给text属性。将xib里面的UILabel的Attributed全部改为Plain后, 内存泄露修改。
我猜测:如果xib里面设置有attributeText,而在代码里面有没有使用这个属性,那么就会造成内存泄露。稍后我会测试一下。
更新:又花了些时间来测试这个内存泄露,发现其实不完全是attributeText的问题,xib里面大概有10多个UILabel,有10个UILabel使用了attributeText,其中只有一个attributeText有问题,
如上图所示,我删除标为 1 的代码后,内存泄露消失。但我发现 标1 和 标2 的代码完全一样,为什么不是 标2 的代码导致内存泄露呢?而且类似 标1 的代码还存在好几处。为什么不是其他类似代码的问题呢?
我已经完全遭逼了!