iOS 性能优化最全总结

客官,里边请!

前言:

大家在开发中,APP性能优化这一块肯定是不可忽视的!可以说这是关乎生死存亡。那么我们该如何测试、优化性能呢?下面我们结合我开发中遇到的情况总结了一下,供大家参考。

正文:

  • instruments:Xcode自带的测试工具
    想要优化性能,第一步是测试,有些点我们能够在编写代码的时候进行优化,但有时候我们多少还是会出现一些性能或内存泄露问题。我们主要使用两个工具:查看程序哪些部分最耗时,可以使用Time Profiler,要查看内存是否泄漏了,就可以使用Leaks。

  • 避免使用过于复杂的XIB
    当你加载一个XIB的时候所有内容都被放在了内存里,包括任何图片。如果有一个不会即刻用到的view,你这就是在浪费宝贵的内存资源了。

  • 不要阻塞主线程
    在iOS里关于UIKit的操作都是放在主线程,因此如果主线程被阻塞住了,你的UI可能无法及时响应事件,给人一种卡顿的感觉。大多数阻塞主线程的情况是在主线程做IO操作,比如文件的读写,包含数据库、图片、json文本或者log日志等,尽量将这些操作放放到子线程(如果数据库有一次有较多的操作,记得采用事务来处理,性能相差还是挺大的),或者在后台建立对应的dispatch queue来做这些操作,比如一个低级别的serial queue来负责log文件的记录等等。

  • 使用并优化缓存
    一般为了提升用户体验,都会在应用中使用缓存。一个极好的原则就是,缓存所需要的,也就是那些不常改变但是需要经常读取的东西。比如对于图片资源可以使用SDWebImage这个开源库,里面就实现了一个图片缓存的功能。

  • 采用合适的渲染方法
    在iOS中可以有很多方法做出漂亮的按钮。你可以用整幅的图片,可调大小的图片,或者可以用CALayer, CoreGraphics甚至OpenGL来画它们。还有比如经常设置的按钮或View的圆角,一般采用cornerRadius。但还是有些性能问题,如果圆角视图要多次使用,如如果每个tableViewCell都要加载,我建议可以通过自己用贝塞尔曲线去画圆角。

  • 处理内存警告
    一旦系统内存过低,iOS会通知所有运行中app。在官方文档中是这样记述:
    如果你的app收到了内存警告,它就需要尽可能释放更多的内存。最佳方式是移除对缓存,图片object和其他一些可以重创建的objects的strong references.
    幸运的是,UIKit提供了几种收集低内存警告的方法:
    · 在app delegate中使用applicationDidReceiveMemoryWarning:的方法
    · 在你的自定义UIViewController的子类(subclass)中覆盖didReceiveMemoryWarning
    · 注册并接收 UIApplicationDidReceiveMemoryWarningNotification的通知
    一旦收到这类通知,你就需要释放任何不必要的内存使用。
    例如,UIViewController的默认行为是移除一些不可见的view,它的一些子类则可以补充这个方法,删掉一些额外的数据结构。一个有图片缓存的app可以移除不在屏幕上显示的图片。
    这样对内存警报的处理是很必要的,若不重视,你的app就可能被系统杀掉。

  • 优化TableView
    Table view需要有很好的滚动性能,不然用户会在滚动过程中发现动画的瑕疵。
    为了保证table view平滑滚动,确保你采取了以下的措施:
    · 正确使用reuseIdentifier来重用cells
    · 尽量使所有的view opaque,包括cell自身
    · 避免渐变,图片缩放,后台选人
    · 避免使用复杂的xib
    · 如果cell内现实的内容来自web,使用异步加载,缓存请求结果
    · 使用shadowPath来画阴影
    · 减少subviews的数量
    · 尽量不适用cellForRowAtIndexPath:,如果你需要用到它,只用一次然后缓存结果
    · 使用正确的数据结构来存储数据
    · 使用rowHeight, sectionFooterHeightsectionHeaderHeight来设定固定的高,不要请求delegate

  • 减少程序启动过程中的任务
    当用户点击app的图标之后,程序应该尽可能快的进入到主页面,尽可能减少用户的等待时间,比如我们的应用程序在启动的时候会去做3d模型的渲染操作,完成之后在进入首页面展示,但其实我们可以先进入到主页面,将渲染3d的任务放到子线程去完成,缩短用户需要等待的时间。

  • 懒加载view
    例如:不要在cell里面嵌套太多的view,这会很影响滑动的流畅感,而且更多的view也需要花费更多的CPU跟内存。假如由于view太多而导致了滑动不流畅,那就不要在一次就把所有的view都创建出来,把部分view放到需要显示cell的时候再去创建。

  • 避免反复处理数据
    许多应用需要从服务器加载功能所需的常为JSON或者XML格式的数据。在服务器端和客户端使用相同的数据结构很重要;

先这些,欢迎大家补充。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容