对IOS开发项目优化发现的性能和崩溃问题

每次发版本之前总是遇见一些崩溃和性能问题,当然开发过程中,由于自测强度不大,一般很难发现隐藏的问题,这些异常崩溃问题和UItableView列表大数据量的情况下卡顿都是测试人员提出来的。

接下来简单的说说IOS项目的性能优化问题:

UITableView 性能优化

最基础的reuseIdentifier就不用说了,其次利用工具instrument查看当前表页面的耗时情况,发现NSDataFormater开销很大。所以NSDataFormate最好用属性保存着,一次性创建保存格式化信息,没有必要在cell创建设置数据时候alloc临时变量,真的非常消耗CPU时间。

如果高度固定,一定要用rowHeight。而不是代理返回高度。

如果高度不固定,布局复杂,则在数据AFN返回后,在success的block回调到数据业务层的时候就进行frame模型的处理。并把计算后的cell高度放入数据模型保存,在这个cellForIndex直接返回Cell 的高度,以此提高性能,解决CPU耗时问题。

我们知道计算主要是CPU,而画面的绘制显示主要是GPU渲染。所以如果层级较复杂,且不透明最好设置opaque = YES,这个属性可以让OC内部利用最优的策略去绘制界面,降低GPU负载。

对控件设置cornerRadius后对其进行clip或mask操作时,会导致offscreen rendering,而这个是在GPU中进行的,所以快速滑动tableView时,假如圆角对象较多,会导致GPU负载大增。这时候我们可以设置layer的shouldRasterize属性为YES,可以将负载转移给CPU。更为彻底的做法是直接在后台绘制圆角图片然后输出到主线程显示,尽量避免使用圆角、阴影、遮罩等属性。

将GPU的部分渲染转接给CPU,那么如何转接呢?我们可以在单个控件中重载drawRect:方法,直接将文字和图片绘制然后输出到主线程上。

一些崩溃问题

很多类文件中的属性定义,有的NSString和delegate代理都有很多误写为assign,导致很多对象释放后assign属性指针成为野指针,导致崩溃。指针类型的数据最好用weak,而不是assign,这里的一个主要区别是weak在原对象销毁后,会被置为nil,而assign不会。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: