iOS开发之性能优化
1.避免过于庞大的XIB
当加载XIB的时候把所有的东西都放在了内存里,包括任何的图片;如果有一个不会即刻用到的view,就会浪费宝贵的内存资源了。
当加载一个引用了图片或者声音资源的nib时,nib加载代码会把图片和声音文件写进内存。
2.不要阻塞主线程
UIKit在主线程上的所有工作,渲染,管理触摸,回应输入等都需要在上面完成。
将耗时操作放在子线程中。
3.在imageViews中调整图片的大小
如果要在UIImageView中显示一个来自bundle的图片,你就应该保证图片的大小和UIImageView的大小相同。在运行中缩放图片是很耗费资源的,特别是UIImageView嵌套在UIScrollView中的情况下。
如果是从远程服务器加载,本地无法控制图片的大小。应该在下载完成 后,最好用background thread,缩放一次,然后在UIImageView中使用缩放后的图片。
4.选择正确的collection
Arrays:有序的一组值。使用index来lookup很快,使用value lookup很慢,插入/删除很慢。
Dictionaries:存储键值对。用值来查找比较快。
Sets:无序的一组值。用值来查找很快,插入/删除很快。
5.重用或者延迟加载Views
如点击一个按钮需要呈现一个view的场景。
第一种:创建并隐藏这个view当这个screen加载的时候,当需要时显示它。(更加耗内存)
第二各:当需要时才创建并展示。(比上一种慢)
6.Cache,Cache,还是Cache!
Cache所需要Cache的(也就是那些不大可能改变但是需要经常读取的东西)
7.权衡渲染的方法
简单来说,就是用事先渲染好的图片更快一些,因为如此一来iOS就免去了创建一个图片再画东西上去然后显示在屏幕上的程序。问题是你需要把所有你需要用到的图片放到app的bundle里面,这样就增加了体积 – 这就是使用可变大小的图片更好的地方了: 你可以省去一些不必要的空间,也不需要再为不同的元素(比如按钮)来做不同的图。
然而,使用图片也意味着你失去了使用代码调整图片的机动性,你需要一遍又一遍不断地重做他们,这样就很浪费时间了,而且你如果要做一个动画效果,虽然每幅图只是一些细节的变化你就需要很多的图片造成bundle大小的不断增大。
总得来说,你需要权衡一下利弊,到底是要性能能还是要bundle保持合适的大小。
8.重用重大开销对象
想要避免使用这个对象的瓶颈你就需要重用他们,可以通过添加属性到你的class里或者创建静态变量来实现。
注意如果你要选择第二种方法,对象会在你的app运行时一直存在于内存中,和单例(singleton)很相似。
9.避免反复处理数据
比如需要数据来展示一个tableView,最好直播从服务器取array结构的数据以避免的额外的中间数据结构改变。
如果需要从特定的key中取数据,那么就使用键值对的dictionary;
10.正确设定背影图片
使用UIColor的colorWithPatternImage来设置背景色;
在view中添加一个UIImageView作为一个子View;
如果你使用全画幅的背景图,你就必须使用UIImageView因为UIColor的colorWithPatternImage是用来创建小的重复的图片作为背景的。
如果你用小图平铺来创建背景,你就需要用UIColor的colorWithPatternImage来做了,它会更快地渲染也不会花费很多内存
11.优化Table View
正确使用reuseIdentifier来重用cells
尽量使所有的view opaque,包括cell自身
避免渐变,图片缩放,后台选人
缓存行高
如果cell内现实的内容来自web,使用异步加载,缓存请求结果
使用shadowPath来画阴影
减少subviews的数量
尽量不适用cellForRowAtIndexPath:,如果你需要用到它,只用一次然后缓存结果
使用正确的数据结构来存储数据
尽量使用rowHeight, sectionFooterHeight 和 sectionHeaderHeight来设定固定的高,不要请求delegate
12.使用正确的数据存储选项
使用NSUserDefaults(只能存一些小型数据,比如一些简单的布尔型的设置选项)
使用XML,JSON或者plist(需要读取文件到内存里去解析,这样是很不经济的)
NSCoding(也是文件读写,也有上述问题)
Sqlite(可以存储大数据)
13.加快启动时间
尽可能做更多的异步任务
避免使用庞大的XIB,因为他们是在主线程上加载,尽量使用Storyboards.(必须把设备从Xcode断开来测试启动速度)
14.使用Autorelease Pool
创建多个临时对象,发现内存一直减少,直到这些对象被release的时候,这是因为只有当autorelease pool的时候memory才会被释放。
iOS开发之性能优化的更多相关文章
- 李洪强iOS开发之性能优化技巧
李洪强iOS开发之性能优化技巧 通过静态 Analyze 工具,以及运行时 Profile 工具分析性能瓶颈,并进行性能优化.结合本人在开发中遇到的问题,可以从以下几个方面进行性能优化. 一.view ...
- 复杂TableView在iOS上的性能优化
声明:本文翻译自<iOS performance optimization>,原文作者 Khang Vo.翻译本文纯属为了技术交流的目的,并不具有任何的商业性质,也不得利用本文内容进行商业 ...
- [iOS Animation]-CALayer 性能优化
性能优化 代码应该运行的尽量快,而不是更快 - 理查德 在第一和第二部分,我们了解了Core Animation提供的关于绘制和动画的一些特性.Core Animation功能和性能都非常强大,但如果 ...
- HoloLens开发与性能优化实践
HoloLens中国版终于于5月底在中国上市,同时国内的技术社区经过一年的成长也有了很大的扩张,越来越多的开发者开始进入了HoloLens开发领域,尝试着使用混合现实(Mixed Reality)技术 ...
- 【Unity游戏开发】性能优化之在真机上开启DeepProfile与踩坑
一.引子 最近马三入职了新公司,平时除了负责编辑器开发之外还要做一些游戏性能优化方面的工作.在这里首先给大家安利一下Unity官方的性能测试分析工具URP ,这个工具目前是免费,测试的过程中也不需要接 ...
- Java高级开发_性能优化的细节
一.核心部分总结: 尽量在合适的场合使用单例[减负提高效率] 尽量避免随意使用静态变量[GC] 尽量重用对象,避免过多过常地创建Java对象[最大限度地重用对象] 尽量使用final修饰符[内联(in ...
- 基于AngularJS/Ionic框架开发的性能优化
AngularJS作为强大的前端MVVM框架,虽然已经做了很多的性能优化,但是我们开发过程中的不当使用还是会对性能产生巨大影响. 下面提出几点优化的方法: 1. 使用单次绑定符号{{::value}} ...
- Android开发——布局性能优化的一些技巧(一)
0. 前言 上一篇我们分析了为什么LinearLayout会比RelativeLayout性能更高,意义在于分析了这两种布局的实现源码,算是对一个小结论的证明过程,但是对布局性能的优化效果,对这两种布 ...
- IOS tableView的性能优化(缓存池)
使用缓存池(标识类型) 1.通过 一个 标识 去 缓存池 中寻找可循环得用的cell 2.如果缓存池找不到可循环得用的cell:创建一个新的cell(给cell贴个标识) 3.给cell设置新的数据 ...
随机推荐
- pt-table-checksum解读
pt-table-checksum是目前可以说是最好的查看主从一致性的工具 先来个使用例子,有助快速上手使用 在主库执行: mysql>GRANT SELECT, PROCESS, SUPER, ...
- hdu2095 像水题的不错题 异或运算
异或运算的基础有点忘记了 先介绍一下..2个数异或 就是对于每一个二进制位进行位运算 具有2个特殊的性质 1.一个数异或本身恒等于0,如5^5恒等于0: 2.一个数异或0恒等于本身,如5^0恒等于5. ...
- Cloudera Manager Free Edition 4.1 和CDH 4.1.2 简易安装教学
转载:http://fenriswolf.me/2012/12/06/cloudera-manager-free-edition-4-1-和-cdh-4-1-2-简易安装教学/ 安装及管理一个大的Ha ...
- WIFI网络访问(一)
一,WIFI 网卡有哪些状态? WIFI 总共有以下五个状态,实际就是一些整形常量: 1. WIFI_STATE_DISABLED : WIFI 不能使用,其值是: 1 . 2. WIFI_S ...
- PHP学习笔记十二【数组排序】
<?php $arr=array(0,5,-1); $temp=0; for($i=0;$i<count($arr)-1;$i++) { for($j=0;$j<count($arr ...
- 数据库监控[Z]
--查看表锁 select * from sys.v_$sqlarea where disk_reads>100 --监控事例的等待 select event,sum(decode(wai ...
- 在windows中使用VMWare安装Mac OS 10.7
请参考http://www.cnblogs.com/huwlnew/archive/2011/11/15/2250342.html http://unmi.cc/vmware9-install-mac ...
- C# Winform对文件夹的权限判断及处理
WindowsIdentity类可以获取当前执行者的身份信息 /// <summary> /// 递归搜索文件方法 /// </summary> /// <param n ...
- Sum Problem-hdu-1001
Hey, welcome to HDOJ(Hangzhou Dianzi University Online Judge). In this problem, your task is to calc ...
- delphi idhttp 实战用法(TIdhttpEx)
以delphi XE8 自带indy(10.5.8.0)组件为例,分享实战中遇到的问题及解决方法. TIdHttpEx 用法实例01[多线程获取网页](包含完整源码) 实例02(如何Post参数,如何 ...