JSON

25条提高iOS App性能的技巧和诀窍(2)

字号+ 作者:H5之家 来源:H5之家 2016-09-14 13:00 我要评论( )

注意当你加载一个XIB到内存的时候,它所有的内容都会载入内存,包括所有的图片。如果你有视图但不是要立即使用,那你就浪费了珍贵的内存。值得注意的是这不会发生在故事板中,因为故事版只会在需要的时候实例化一个

注意当你加载一个XIB到内存的时候,它所有的内容都会载入内存,包括所有的图片。如果你有视图但不是要立即使用,那你就浪费了珍贵的内存。值得注意的是这不会发生在故事板中,因为故事版只会在需要的时候实例化一个视图控制器。

当你载入一个xib,所有的图像文件会被缓存,如果是开发OSX,那么音频文件也会被缓存。

如是说:

当你载入一个包含了图和声音资源引用的nib文件时,nib加载代码读取实际的图片文件和音频文件到内存中并缓存它。在OS X中,图片和音频资源被存储在已命名的缓存 中这样你可以在之后需要的时候访问它们。在iOS中,只有图片资源被缓存,访问图片,你使用NSImage或者UIImage的imageNamed:方法来访问,具体使用取决于你 的平台。

显然这也发生在使用故事板的时候。尽管如此,我还不能找到这种说法的证据。如果你知道,请给我留言。

想学习更多关于故事板的更多内容吗?看看Matthijs Hollemans的Beginning Storyboards in iOS 5 Part 1andPart 2.


5)不要阻塞主进程

你永远不应该在主线程中做任何繁重的工作。这是因为UIKIt的所有工作都在主线程中进行,比如绘画,管理触摸,和响应输出。

你的app的所有工作都在主线程上进行就会有阻塞主线程的风险,你的app会表现的反应迟钝。这是在App Store里获一星评论的快速途径!(作者卖萌..)

阻塞主线程最多的情况就是发生在你的app进行I/O操作,包括牵扯到任何需要读写外部资源的任务,比如读取磁盘或者网络

你可以异步的执行网络任务使用NSURLConnection中的这个方法:

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

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

如果你在做任何大开销的操作(比如执行一个耗时的计算,或者读写磁盘)使用Grand Central Dispatch(GCD)或者NSOperations 和 NSOperationQueues.

使用GCD的模板如下代码所示:

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

这里为什么dispatch_async 嵌套在第一个的里面?这是因为任何UIKit相关的代码都必须在主线程上执行。

对NSOperation和GCD的详情感兴趣?看看Ray Wenderlich’sMultithreading and Grand Central Dispatch on iOS for Beginners教程,和 Soheil Azarpour’sHow To Use NSOperations and NSOperationQueues教程。



6)调整图像视图中的图像尺寸

如果你用UIImageView呈现app束中的图片时,确认图片和UIImageView的尺寸相同。缩放图片会非常的耗时,特别是当你的UIImageView被嵌入UIScrollView。

如果图片是从远程服务器上下载的,有时你没法控制图片尺寸,或者你不能在服务器上在下载之前缩放它。在这些情况下你可以在图片下载完成后手动缩放一次,最好是在后台进程中。然在UIImageView中使用调整尺寸之后的图片。


7)选择正确集合

学着怎么在手头工作中使用最合适的类或对象是写出高效代码的基本。当时用集合是(collections),这个说法特别对。

可喜的是在苹果开发者文档()中有详细解释可用类之间的关系,还有解释各个类的适用情况。这个文档是每个使用集合的人的必读文档。

这是一个最常见的集合类型的快速简介:


8)启用Gzip压缩

大量和持续增长的app依赖从远端服务器或者外部APIs获取的外部数据。某些时候你可能会开发一些需要下载XML,JSON,HTML或者其他文本格式的应用。

问题是移动设备不能保证网络环境,用户可能一分钟在边缘网络,下一分钟又是3G网络,无论什么情况下,你不想你的用户一直等待。

一个减少文件大小并加速下载的网络资源的方法是同时在你的服务器和客户端上使用GZIP压缩,对于文本数据这种有高比率压缩的数据来说非常有用。

好消息是iOS早已默认支持GZIP压缩,如果你是使用NSURLConnection或者建立在这之上的框架比如AFNetworking。更好的消息是一切云服务提供商像Google App Engine早已发送压缩之后的响应数据。

这里有一篇文章great article about GZIP compression介绍如何在你的Apache或IIS服务器上启用GZIP。


中级性能提升

好的,当谈到优化你的代码时,你应该很自信你已经初级的方法已经完全掌握了。但有时候有的问题的解决方法并不是那么显而易见,它由你app的结构和代码决定,尽管如此,在正确的上下文中,它们可能是没有价值的。

9)重用和延迟加载视图

越多的视图就有越多的绘图操作,最终意味着更多的CPU和内存开销。这说得特别对如果你的app嵌入很多视图在UIScrollView时。

管理这个的技巧是去模拟UITableView 和 UICollectionView的行为:不要一次创建所有的子视图,而是在需要的时候创建,然后把他们假如重用队列中。

这样,你只需要在视图浮动时配置你的视图,避免昂贵的资源分配开销。

视图创建的时机问题也同样适用于你app的其他地方。试想当你点击一个button时呈现一个视图的情景。至少有两种方法:

1.屏幕第一次载入时创建视图并隐藏它。当你需要的时候,显示出来。

2.需要呈现的时候一次创建视图并显示它。

每种方法都有各自的优缺点

使用第一种方法,你消耗了更多内存因为从创建开始到它释放前你都保持了它的内存,然而,当你点击button的时候,你的app会表现得响应快速因为它只需要更改视图的可视化属性。

使用第二种方法会有相反的效果,在需要的时候创建视图,消耗更少的内存,但当button被点击时应用会表现得不那么响应快速。


10)缓存,缓存,缓存


在开发应用时的一个伟大的经验是"Cache what matters"--也就是说那些不大会改变但会平凡被访问的东西。

你能缓存些什么呢?缓存的候选项有远程服务器的响应,图片,已计算过的值(比如UITableView的行高)。

NSURLConnection 根据处理的Http头缓存资源到磁盘或者内存中,你甚至可以手动创建一个NSURLRequest值加载缓存过的值。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • php使用json_decode返回NULL

    php使用json_decode返回NULL

    2016-09-14 13:00

  • php基于jquery的ajax技术传递json数据简单实例,jqueryjson

    php基于jquery的ajax技术传递json数据简单实例,jqueryjson

    2016-09-05 18:01

  • php中的Json函数在jquery中的使用

    php中的Json函数在jquery中的使用

    2016-09-01 14:00

  • www.93847xjj100.com新锦江备用网址

    www.93847xjj100.com新锦江备用网址

    2016-08-29 16:00

网友点评