一、启动优化:
1.main函数之前:删除不用的类、以及图片、load方法可以改成initialize情况下改掉、减少单例、减少不用的动态库、减少selector、减少类分类的数量、合并自研的动态库
、减少xib、检测重复代码或未被调用的代码、linkMap分析那个包占用资源大 AppCode检测未使用的代码。
2.main函数之后:第三方延迟加载初始化、首页异步加载缓存。
3.二进制重排。
二、卡顿优化
1.设置圆角不设置maskToBounds、不在layousubViews修改布局、设置layer阴影path、layer替换UIView、富文本计算高度、layout层提前计算view 或者cell的布局、异步线程绘制图片、异步添加水印、webp图片替换jpg、设置frame 统一调用、不使用xib、图片size跟后端设计商量按UIImageView大小设置、减少mask遮罩使用backgroundColor、timer统一替换成dispatch_source_t、减少图层、减少离屏渲染(上下文切换,两个渲染缓冲区来回切换)。
2.加载大图片或者使用率低图片使用initWithContentsOfFile(用完就销毁)。
imageNamed时全局缓存图片,第一次退后后台和收到内存警告时才会清除。
3.不透明的视图opaque设置为YES、
4.尽量避免日期格式转换:后端返回格式化的时间。
5.界面消失时暂停timer
6.cell上视图不要remove 要用hidden
7.尽量不要调用drawRect或者 setDeedDisplay。
三、内存优化
3.0autoreleasepool
1.autoreleasepool(在runloop结束是释放的)及时释放局部变量、懒加载view、静态分析内存泄露、动态分析具体页面内存泄露、使用第三方库内存泄露检测
2.比较复杂的界面采用tableView绘制,利用tableView的复用机制减少不必要的渲染和内存占用。
3.1内存警告时:
1.清空SDWebImage缓存,管理单例类将不重要的单例置为nil。
2.使用UIImage drawInRect 绘制图片是先解码图片,再生成原始分别率大小的bitmap,很耗内存,使用ImageIO接口避免中间bitmap产生。
3.2内存泄露:
1.UIGraphicsEndImageContext 和 UIGraphicsBeiginImageContext 必须成对出现不然会造成cotnent泄露.
2.CAAnimation的delegate也是对Objc的强引用
3.NotificationBlock用法 是单例 会保存里面的self的生命周期会内存泄露
4.CF创建的对象必须 CFRelease下。
3.3循环引用
1.block、delegate、wkwebview的useContentController addScriptMessageHandler:self
2.UIAlertController的事件里面使用alert,用__weak
3.NSTimer
4.A类别中动态添加属性B,如果属性B应用到A,容易引起循环引用
5.把self加入到NSArray中
6.NSNotification 引用self iOS9.0之前是需要手动remove,iOS9.0自动remove
7.设置CALayer的delegate是self,
四、耗电优化
1.合并图片请求一个接口、无网络不请求有网络再请求、断点续传、弱网超时时间更改、定位完及时停掉定位、一定时间内不重新定位(BecomeDidAppear)
2.使用dispatch_io 读写数据
3.缓存IP地址 使用httpDNS
五、Swift编译速度优化
1.私有库二进制化
2.删除NSLog
3.查看耗时函数:三目运算、if语句运算、减少if替换橙switch、不要混合计算
xib约束问题、不要类型推断、计算中最好不要出现可选值、if语句不要出现可选可选类型、高阶函数 {}要指明参数和返回值。
4.debug不生成dysm文件
5.设置Deployment Postprocessing 和 Strip Linked Porduct 同时设置为YES,构建会去除symbol符号就时类名 函数名。不影响日志和解析。