在开发iOS应用程序时,让程序具有良好的性能是非常关键的。

这也是用户所期望的,假设你的程序执行迟钝或缓慢,会招致用户的差评。然而因为iOS设备的局限性,有时候要想获得良好的性能,是非常困难的。

在开发过程中,有很多事项须要记住,而且关于性能影响非常easy就忘记。

本文收集了25个关于能够提升程序性能的提示和技巧,把性能优化技巧分为3个不同的等级:0基础、中级和高级

0基础

在开发过程中,以下这些0基础技巧须要时刻注意:

1.使用ARC进行内存管理

2.在适当的情况下使用reuseIdentifier

3.尽可能将View设置为不透明(Opaque)

4.避免臃肿的XIBs

5.不要堵塞主线程

6.让图片的大小跟UIImageView一样

7.选择正确的集合

8.使用GZIP压缩

1) 使用ARC进行内存管理

ARC是在iOS 5中公布的,它攻克了最常见的内存泄露问题——也是开发人员最easy健忘的。

ARC的全称是“Automatic Reference Counting”——自己主动引用计数。它会自己主动的在代码中做retain/release工作,开发人员不用再手动处理。

以下是创建一个View通用的一些代码块:

    1. UIView *view = [[UIView alloc] init];
    1. // ...
    1. [self.view addSubview:view];
    1. [view release];

在上面代码结束的地方非常easy会忘记调用release。只是当使用ARC时。ARC会在后台自己主动的帮你调用release。

ARC除了能避免内存泄露外。还有助于程序性能的提升:当程序中的对象不再须要的时候,ARC会自己主动销毁对象。所以。你应该在project中使用ARC。

以下是学习ARC的一些资源:

苹果的官方文档

Matthijs Hollemans的0基础ARC

Tony Dahbura的怎样在Cocos2D 2.Xproject中使用ARC

假设你仍然不确定ARC带来的优点。那么看一些这篇文章:8个关于ARC的神话——这可以让你相信你应该在project中使用ARC!

值得注意的是。ARC并不能避免全部的内存泄露。

使用ARC之后。project中可能还会有内存泄露。只是引起这些内存泄露的主要原因是:block。retain循环。对CoreFoundation对象(一般是C结构)管理不善,以及真的是代码没写好。

这里有一篇文章是介绍哪些问题是ARC不能解决的 —
以及怎样处理这些问题。

2) 在适当的情况下使用reuseIdentifier



在适当的情况使用reuseIdentifier


在iOS程序开发中一个普遍性的错误就是没有正确的为UITableViewCells、UICollectionViewCells和UITableViewHeaderFooterViews设置reuseIdentifier。
 

为了获得最佳性能。当在tableView:cellForRowAtIndexPath:方法中返回cell时,table view的数据源通常会重用UITableViewCell对象。table view维护着UITableViewCell对象的一个队列或者列表,这些数据源已经被标记为重用了。

假设没有使用reuseIdentifier会发生什么?假设你在程序中没有使用reuseIdentifier。table view每次显示一个row时。都会配置一个全新的cell。这事实上是一个很消耗资源的操作,而且会影响程序中table view滚动的效率。

自iOS 6以来,你可能还希望header和footer views,以及UICollectionView的cell和supplementary views。

为了使用reuseIdentifiers,在table view请求一个新的cell时,在数据源中调用以下的方法:

    1. static NSString *CellIdentifier = @"Cell";
    1. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

假设table view维护的UITableViewCell队列或列表中有可用的cell。则从队列从移除一个已经存在的cell,假设没有的话,就从之前注冊的nib文件或类中创建一个新的cell。假设没有能够重用的cell。而且没有注冊nib文件或类,tableview的dequeueReusableCellWithIdentifier:方法会返回一个nil。

3) 尽可能将View设置为不透明(Opaque)



尽量将view设置为Opaque

 

假设view是不透明的,那么应该将其opaque属性设置为YES。为什么要这样做呢?这样设置能够让系统以最优的方式来绘制view。opaque属性能够在Interface Builder或代码中设置。

苹果的官方文档对opaque属性有例如以下解释:

This property provides a hint to the drawing system as to how it should treat the view. If set to YES, the drawing system treats the view as fully opaque, which allows the drawing system to optimize some drawing operations and improve performance. If set to
NO, the drawing system composites the view normally with other content. The default value of this property is YES.

(opaque属性提示绘制系统怎样处理view。假设opaque设置为YES,画图系统会将view看为全然不透明。这样画图系统就能够优化一些绘制操作以提升性能。假设设置为NO,那么画图系统结合其他内容来处理view。

默认情况下,这个属性是YES。)

假设屏幕是精巧的,那么这个opaque属性的设置与否不是一个大问题。可是,假设view是嵌入到scroll view中的。或者是复杂动画的一部分,不将设置这个属性的话肯定会影响程序的性能。能够通过模拟器的Debug\Color Blended Layers选项来查看哪些view没有设置为不透明。为了程序的性能。尽可能的将view设置为不透明!

4) 避免臃肿的XIBs



避免臃肿的XIBs

 

在iOS 5中開始使用Storyboards,而且将替代XIBs。

只是在有些情况下XIBs仍然实用。假设你的程序须要执行在装有iOS 5之前版本号的设备上。或者要自己定义可重用的view。那么是避免不了要使用XIBs的。

假设必需要使用XIBs的话,尽量让XIBs文件简单。

而且每一个view controller对于一个XIB文件。假设能够的话,把一个view controller的view不同的层次单独分到一个XIBs文件里。

(注意:当把一个XIB文件载入到内存时。XIB文件里的全部内容都将被载入到内存中,包含图片。假设有一个view还不马上使用的话。就会造成内存的浪费。而这在storyboard中是不会发生的,由于storyboard还在须要的时候才实例化一个view controller。)

当载入XIB时。全部涉及到的图片都将被缓存。而且假设是开发的程序是针对OS X的话,声音文件也会被载入。苹果的官方文档这样说:

When you load a nib file that contains references to image or sound resources, the nib-loading code reads the actual image or sound file into memory and and caches it. In OS X, image and sound resources are stored in named caches so that you can access them
later if needed. In iOS, only image resources are stored in named caches. To access images, you use the imageNamed: method of NSImage or UIImage, depending on your platform.

(当载入一个nib文件时,也会将nib文件涉及到的图片或声音资源载入到内存中。nib-loading代码会将实际的图片或声音文件读取到内存中,并一直缓存着。在OS X中。图片和声音资源都存储在命名缓存中,这样之后假设须要的话。能够对其进行訪问。在iOS中,仅仅有图片资源被存储到命名缓存中。要訪问图片的话,使用NSImage或UIImage(依据不同的系统)的imageNamed:方法就可以。)

显然,在使用storyboard时也会发生类似的缓存操作;只是我没有找到相关内容的不论什么资料。想要学习storyboard的很多其它知识吗?能够看看Matthijs Hollemans写的iOS 5中:0基础Storyboard
Part 1
Part2

5) 不要堵塞主线程



永远都不要在主线程做繁重的任务。由于UIKit的左右任务都在主线程中进行,比如绘制、触摸管理和输入响应。
 

在主线程做全部任务的风险是:假设你的代码堵塞了主线程,那么程序将出现反应迟钝。

这回招致用户在App Store上对程序的差评!

在运行I/O操作中,大多数情况下都会祖塞主线程,这些操作须要从读写外部资源,比如磁盘或者网络。

关于网络操作能够使用NSURLConnection的例如以下方法,以异步的方式来运行:

    1. + (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler

或者使用第三方框架。比如AFNetworking

假设你须要做一些其他类型开销非常大的操作(比如运行一个时间密集型的计算或者对磁盘进行读写),那么就使用GCD(Grand Central Dispatch),或NSOperations 和 NSOperationQueues。

以下的代码是使用GCD的一个模板:

    1. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    1. // switch to a background thread and perform your expensive operation
    1. dispatch_async(dispatch_get_main_queue(), ^{
    1. // switch back to the main thread to update your UI
    1. });
    1. });

如上代码,为什么在第一个dispatch_async里面还嵌套了一个dispatch_async呢?这是由于关于UIKit相关的代码须要在主线程里面运行。

能够看看Ray Wenderlich中的教程:iOS中多线程和GCD—0基础,以及Soheil
Azarpour的怎样使用NSOperations和NSOperationQueues教程

6) 让图片的大小跟UIImageView一样



确保图片和UIImageView大小一致


假设须要将程序bundle中的图片显示到UIImageView中,请确保图片和UIImageView的大小是一样的。由于图片的缩放很耗费资源,特别是将UIImageView嵌入到UIScrollView中。

假设是从远程服务中下载图片。有时候你控制不了图片的尺寸,或者在下载之前无法在server上进行图片的缩放。这样的情况,当图片下载完之后,你能够手动进行图片的缩放——做好是在后台线程中!——然后再在UIImageView中使用缩放过的图片。

7) 选择正确的集合



选择正确的集合


学习使用最适合的类或对象是编写高效代码的基础。特别是在处理集合数据时,尤为重要。



苹果的官网上有一篇文章:集合编程主题(Collections
Programming Topics
)——具体的介绍了在集合数据中能够使用的类,以及什么情况下使用哪个类。在使用集合时,每一个开发人员都应该阅读一下这个文档。


太长,不想阅读(TLDR)?以下是常见集合类型的一个简单介绍:

•数组:是一个值按顺序排列的一个列表。依据索引能够高速查找,只是依据值进行查找就比較慢,另外插入和删除也比較慢。

•字典:  存储键/值对。依据键能够高速查找。

•Sets:  是一个值无序排列的列表。依据值能够高速查找,另外插入和删除也比較快。

 

8) 使用GZIP压缩



使用GZIP压缩

越来越多的程序依赖于外部数据,这些数据一般来自远程server或者其他的外部APIs。

有时候你须要开发一个程序来下载一些数据。这些数据能够是XML,JSON,HTML或者其他一些文本格式。

问题是在移动设备上的网络是不确定的。用户的设备可能在EDGE网络一分钟。然后接着又在3G网络中。无论在什么情况下,都不要让用户等待。

有一个能够优化的选择:使用GZIP对网络传输中的数据进行压缩。这样能够减小文件的大小。并加快下载的速度。

压缩对于文本数据特别实用。由于文本具有非常高的压缩比。

iOS中,假设使用NSURLConnection。那么默认情况下已经支持GZIP压缩了。而且基于NSURLConnection的框架页支持GZIP压缩,如AFNetworking。甚至有些云服务提供商已经提供发送经压缩过的响应内容,比如Google
App Engine

这里有一篇关于GZIP压缩非常好的文章,介绍了怎样在Apache活IISserver中开启支持GZIP压缩。

来源:破船的博客

25个增强iOS应用程序性能的提示和技巧(0基础篇)的更多相关文章

  1. 25个增强iOS应用程序性能的提示和技巧 — 中级篇

    本文由破船译自:raywenderlich 转载请注明出处:BeyondVincent的博客 _____________ 在开发iOS应用程序时.让程序具有良好的性能是非常关键的.这也是用户所期望的. ...

  2. 25个增强iOS应用程序性能的提示和技巧(高级篇)(2)

    25个增强iOS应用程序性能的提示和技巧(高级篇)(2) 2013-04-16 14:56 破船之家 beyondvincent 字号:T | T 在开发iOS应用程序时,让程序具有良好的性能是非常关 ...

  3. 25个增强iOS应用程序性能的提示和技巧(高级篇)(1)

    25个增强iOS应用程序性能的提示和技巧(高级篇)(1) 2013-04-16 14:56 破船之家 beyondvincent 字号:T | T 在开发iOS应用程序时,让程序具有良好的性能是非常关 ...

  4. 25个增强iOS应用程序性能的提示和技巧(中级篇)(3)

    25个增强iOS应用程序性能的提示和技巧(中级篇)(3) 2013-04-16 14:42 破船之家 beyondvincent 字号:T | T 本文收集了25个关于可以提升程序性能的提示和技巧,分 ...

  5. 25个增强iOS应用程序性能的提示和技巧(中级篇)(2)

    25个增强iOS应用程序性能的提示和技巧(中级篇)(2) 2013-04-16 14:42 破船之家 beyondvincent 字号:T | T 本文收集了25个关于可以提升程序性能的提示和技巧,分 ...

  6. 25个增强iOS应用程序性能的提示和技巧--中级篇

    25个增强iOS应用程序性能的提示和技巧--中级篇 标签: ios性能优化内存管理 2013-12-13 10:55 738人阅读 评论(0) 收藏 举报  分类: IPhone开发高级系列(34)  ...

  7. 25个增强iOS应用程序性能的提示和技巧(初级篇)

    25个增强iOS应用程序性能的提示和技巧(初级篇) 标签: ios内存管理性能优化 2013-12-13 10:53 916人阅读 评论(0) 收藏 举报  分类: IPhone开发高级系列(34)  ...

  8. (转)25个增强iOS应用程序性能的提示和技巧--初级篇

    在开发iOS应用程序时,让程序具有良好的性能是非常关键的.这也是用户所期望的,如果你的程序运行迟钝或缓慢,会招致用户的差评.然而由于iOS设备的局限性,有时候要想获得良好的性能,是很困难的.在开发过程 ...

  9. 25 个增强iOS应用程序性能的提示和技巧 应用程序性能的提示和技巧

    初级 在开发过程中,下面这些初级技巧需要时刻注意: 1.使用ARC进行内存管理2.在适当的情况下使用reuseIdentifier3.尽可能将View设置为不透明(Opaque)4.避免臃肿的XIBs ...

随机推荐

  1. Mybatis整理_01

    Mybatis专题 Mybaits介绍 Mybatis是一个持久化框架,它有不同语言的版本,比如.NET和Java都有Mybatis对应的类库:它有大多数ORM框架都具有的功能,比如自定义的SQL语句 ...

  2. 表空间与数据文件Offline,online的区别

    首先明确,表空间与数据文件的关系:Oracle数据库表空间有两种,一种smallfile小文件表空间(默认),另一种bigfile大文件表空间: 默认表空间与数据文件的关系:允许一对多的处理方式,一个 ...

  3. js同时使用多个分隔符分割字符串.

    利用正则分割,str.split(/reg/);如果有这样一个字符串: "jb51.net,google.com,baidu.com_weibo.com_haotu.net", 我 ...

  4. 从运维的角度分析使用阿里云数据库RDS的必要性--你不应该在阿里云上使用自建的MySQL/SQL Server/Oracle/PostgreSQL数据库

    开宗明义,你不应该在阿里云上使用自建的MySQL or SQL Server数据库,对了,还有Oracle or PostgreSQL数据库. 云数据库 RDS(Relational Database ...

  5. cursor() — 数据库连接操作 python

    python 操作数据库,要安装一个Python和数据库交互的包MySQL-python-1.2.2.win32-py2.5.exe,然后我们就可以使用MySQLdb这个包进行数据库操作了.      ...

  6. 初识Redux-Saga

    Redus-saga是一个redux的中间件,主要用来简便而优雅的处理redux应用里的副作用(side effect相对于pure function这类概念而言的).它之所以可以做到这一点主要是使用 ...

  7. [转载] kill命令

    转载自http://www.cnblogs.com/peida/archive/2012/12/20/2825837.html Linux中的kill命令用来终止指定的进程(terminate a p ...

  8. python进阶------进程线程(一)

    Python中的进程线程 一.进程线程的概念 1.1进程: 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成.我们编写的程序用来描述进程要完成哪些功能以及 ...

  9. Xshell 的安装教程

    Xshell就是一个远程控制RHEL的软件:其他的还有很多,用什么都无所谓(根据公司情况). 下面我们来安装下这个工具: 双击exe 点下一步: 选 免费的 然后下一步:(免费的功能足够用了) 点接受 ...

  10. .net 分布式的未来:微服务

    一.背景&问题 之前框架是一个基于SOA思想设计的分布式框架.各应用通过服务方式提供使用,服务之间通信是RPC方式调用,具体实现基于.NET的WCF通信平台.框架存在如下2个问题: 1.高并发 ...