自定义“斑马线背景”View,重写drawRect绘制斑马线:
⚠️ 仅仅添加这一个View,内存就比正常增加了3~5M之间。
测试源代码:code - gitbub
一、导致内存增加的行为
重写drawRect
二、为什么重写drawRect会导致内存暴增
我们在 UIView 子类的 drawRect 函数中利用 Quartz2D 绘制图形,UIView 中的视图的内容是通过其控制的 CALayer 对象来绘制和渲染的,而在 CALayer 中显示图像的核心是 CALayer的 contents 属性。contents 默认接收一个 id 类型对象。contents 也称为寄宿图,我们可以重写 drawRect 对 contexts 直接进行绘制,在重写 drawRect 方法时,会先自动生成一个 contents (它的尺寸等于view.width * view.height * 设备分辨率)。
GPU VS CPU 中说明了CoreGraphics 绘制会增大内存开销,所以最好不要食用drawRect 或者 CALayerDelegate 方法。原因就是其必须创建一个寄存图片
。
三、如何解决或者如何替代drawRect方法
CAShapeLayer
- 渲染快速,CAShapeLayer 使用硬件加速,绘制同一个图形会比CoreGraphics快很多。
- 高效使用内存,CAShapeLayer 不需要像普通 CALayer 一样创建一个 contents 图形,所以无路画布多大,都不会占用很多内存。
- 不会被图层边界裁剪掉
- 不会被像素化