一、避免离屏渲染:
当我们设置一些UI视图的图层属性,如果说指令为在未执行之前不能用于直接显示的时候,触发离屏渲染,发生在GPU层面。
场景:
1、圆角(当和maskToBounds一起使用时)
2、图层蒙版
3、阴影
4、光栅化。
基本每个app都会涉及到设置圆角问题,比如头像。处理方式方案一:创建两个imgView,让UI切个四周颜色跟背景色一致,中间圆形块透明化,盖在呈现imgView之上,视觉上就形成了圆角效果,避免了离屏渲染;方案二:使用贝塞尔曲线UIBezierPath和Core Graphics框架画出一个圆角;方案三:使用CAShapeLayer和UIBezierPath设置圆角。
触发离屏渲染会增加GPU工作量,导致CPU和GPU总耗时超出16.7ms,导致UI卡顿和掉帧,所以得避免离屏渲染。
二、避免内存泄漏:
内存泄漏指程序在申请内存后,无法释放已申请的内存空间,内存泄露堆积会吃光内存。导致内存泄漏的根本原因就是存在循环引用,一些内存无法释放,dealloc()方法无法被调用。
场景:
1、VC中NSTimer,未将timer invalidate,dealloc无法调用;
2、通过协议传值时定义的delegate强引用,未使用weak,VC一直持有delegate指导自身被释放;
3、block循环引用,block本身就是VC的一部分,如果调用时使用self强引用,会导致循环引用无法释放。需将调用的self弱引用,__weak修饰处理;
4、VC中子视图对self的持有,如果在子视图中点击跳转等操作需要持有当前vc对象,此时该对象不能强引用,需用weak修饰,我个人一般习惯block抛出在vc中去做处理。
一般通过instruments中Leaks方法动态内存泄漏分析。