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开发之性能优化的更多相关文章

  1. 李洪强iOS开发之性能优化技巧

    李洪强iOS开发之性能优化技巧 通过静态 Analyze 工具,以及运行时 Profile 工具分析性能瓶颈,并进行性能优化.结合本人在开发中遇到的问题,可以从以下几个方面进行性能优化. 一.view ...

  2. 复杂TableView在iOS上的性能优化

    声明:本文翻译自<iOS performance optimization>,原文作者 Khang Vo.翻译本文纯属为了技术交流的目的,并不具有任何的商业性质,也不得利用本文内容进行商业 ...

  3. [iOS Animation]-CALayer 性能优化

    性能优化 代码应该运行的尽量快,而不是更快 - 理查德 在第一和第二部分,我们了解了Core Animation提供的关于绘制和动画的一些特性.Core Animation功能和性能都非常强大,但如果 ...

  4. HoloLens开发与性能优化实践

    HoloLens中国版终于于5月底在中国上市,同时国内的技术社区经过一年的成长也有了很大的扩张,越来越多的开发者开始进入了HoloLens开发领域,尝试着使用混合现实(Mixed Reality)技术 ...

  5. 【Unity游戏开发】性能优化之在真机上开启DeepProfile与踩坑

    一.引子 最近马三入职了新公司,平时除了负责编辑器开发之外还要做一些游戏性能优化方面的工作.在这里首先给大家安利一下Unity官方的性能测试分析工具URP ,这个工具目前是免费,测试的过程中也不需要接 ...

  6. Java高级开发_性能优化的细节

    一.核心部分总结: 尽量在合适的场合使用单例[减负提高效率] 尽量避免随意使用静态变量[GC] 尽量重用对象,避免过多过常地创建Java对象[最大限度地重用对象] 尽量使用final修饰符[内联(in ...

  7. 基于AngularJS/Ionic框架开发的性能优化

    AngularJS作为强大的前端MVVM框架,虽然已经做了很多的性能优化,但是我们开发过程中的不当使用还是会对性能产生巨大影响. 下面提出几点优化的方法: 1. 使用单次绑定符号{{::value}} ...

  8. Android开发——布局性能优化的一些技巧(一)

    0. 前言 上一篇我们分析了为什么LinearLayout会比RelativeLayout性能更高,意义在于分析了这两种布局的实现源码,算是对一个小结论的证明过程,但是对布局性能的优化效果,对这两种布 ...

  9. IOS tableView的性能优化(缓存池)

    使用缓存池(标识类型) 1.通过 一个 标识 去 缓存池 中寻找可循环得用的cell 2.如果缓存池找不到可循环得用的cell:创建一个新的cell(给cell贴个标识) 3.给cell设置新的数据 ...

随机推荐

  1. 登录DSCCC控制台报错提示:安装错误代码: 3

    登录DSCCC控制台报错内容:读取安装配置时出错 检查目录服务控制中心状态时出现意外错误. 显示详细资料 隐藏详细资料 安装错误代码: 3 堆栈: com.sun.directory.common.s ...

  2. WPF学习记录1:ListView的一个模板

    在网上找的一个模板,放在这里,作为笔记,收集 <ListView Grid.Column=" Name="ListmuLu" > <ListView.I ...

  3. IT运维外包甩不掉的包袱

    对一个企业的IT信息部门来说,保证IT系统的安全.稳定和可靠运行是IT部门义不容辞的职责,但IT系统的安全.稳定和可靠是相对的,得看企业IT投入和ROI.现在企业的IT系统运维面临着多重压力:一方面是 ...

  4. Spring Annotation注解进行aop的学习

    使用Maven管理项目,pom文件为: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=" ...

  5. HDU 1051 - Rightmost Digit

    找循环 #include <iostream> #include <cmath> using namespace std; int t,m,p,q; long long n; ...

  6. mysql存储过程调试方法

    有如下一个存储过程 ), i_length ),OUT o_result INT) BEGIN SET @a= NULL; SET @b= NULL; SELECT id INTO @a FROM t ...

  7. apache 设置

    此博客是网站www.beilei123.cn镜像,转载请注明出处. 1.ServerTokens ProdServerTokens Prod 显示“Server: Apache”ServerToken ...

  8. AngularJS 中的 Promise 和 设计模式

    解决 Javascript 异步事件的传统方式是回调函数:调用一个方法,然后给它一个函数引用,当这个方法完结的时候执行这个函数引用. <!-- lang: js --> $.get('ap ...

  9. JSON数据的基础使用

    之前一直把JSON想做一种数据类型,通过这几天的使用,发现其实JSON只是一种数据的格式,而与int string double等等数据类型是有本质的区别. JSON(JavaScript Objec ...

  10. 通过Wmi实现Hyper-V远程管理(一)

    最近公司需要做Hyper-V的远程管理,在现有产品基础上扩展对Hyper V的管理,实现远程开关机.远程开启虚拟机会话,其他内容可查看MSDN中有对Hyper-V的描述和相关实例代码. Wmi操作hy ...