JSON

25条关于提高app性能的技巧(4)

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

大多数开发者是添加 QuartzCore框架到工程中,然后写如下代码: import QuartzCore/QuartzCore.h // Somewhere later ...UIView *view = [[UIView alloc] init]; // Setup the shadow ...view.layer.shadowOffset = C

大多数开发者是添加 QuartzCore框架到工程中,然后写如下代码:

import <QuartzCore/QuartzCore.h> // Somewhere later ... UIView *view = [[UIView alloc] init]; // Setup the shadow ... view.layer.shadowOffset = CGSizeMake(-1.0f, 1.0f); view.layer.shadowRadius = 5.0f; view.layer.shadowOpacity = 0.6;

看起来非常简单,是吧?

不好的是这个方法有一个问题。核心动画必须要先做一幕动画确定视图具体形状之后才渲染阴影,这是非常费事的操作。

这里有个替代方法让系统更好的渲染,设置阴影路径:

view.layer.shadowPath = [[UIBezierPath bezierPathWithRect:view.bounds] CGPath];

如果你想知道这个内容的更多技巧,Mark Pospesel 写过一篇post about shadowPath.

设置阴影路径,iOS不需要总是计算如何绘制阴影。而是用已经计算好的的路径。坏消息是它依赖与你的视图格式,你是视图可能很难计算这个路径。另一个问题是你需要在每次视图的框架改变时更新阴影路径。

20) 优化你的表格视图
表格视图需要快速的滚动,如果不能,用户能确切注意到很滞后。

为了让你的表格视图流畅的滚动,保证你实现了下列的建议。

21) 选择正确的数据存储方式
当要存储和读取大数据的时候你的选择是什么?

你有一些选项,包括:

NSUserDefaults有什么问题呢?虽然说NSUserDefaults是好而且简单,它确实很好只有当你有很少的数据要存(像你的等级,或者音量是开还是关)。一旦你接触大数据,会有更好的其他选择。

保存在结构化文件中也可能有问题。一般的,在解析之前,你需要加载整个文件到内存中,这是非常耗时的操作。你可以使用SAX去处理XML文件,但是那是一个复杂的作法。同时你加载了全部的对象进内存,其中有你想要的也有不想要的。

那么NSCoding怎么样呢?不幸的是,它也同样要读写文件,跟上面说的方法有同样的问题。

你最好的解决方法是使用SQLite或者 Core Data. 通过这些技术,你可以执行特定的查询只加载需要的对象,避免强力搜索方法来检索数据。性能方面,SQLite和Core Data 非常接近。

SQLite 和 Core Data最大的不同就是它们的使用方法。Core Data呈现为一个对象图模型,但是SQLite是一个传统的DBMS(数据库管理系统).通常Apple建议你用Core Data,但是除非你有特殊的原因不让你你会想避开它,使用更低级的SQLite。

如果在你的app中使用SQLite,一个方便的库 FMDB 允许你使用SQLite而不用专研SQLite的C API。

高级性能技巧

寻找一些精英的方式去成为十足的代码忍者?这些高级性能技巧可以合适的时候使用让你的app运行得尽可能的高效。

22)加速启动时间
App的启动时间非常重要,特别是第一次启动的时候。第一影响意味着太多了!

最大的事情是保证你的App开始尽量的快,尽量的多的执行异步任务,不如网络请求,数据库访问,或者数据解析。

尽量避免臃肿的XIBs,因为你在主线程中加载。但是在故事板中不会有这个问题,所以尽量用它们。

Note: 监察人不会运行你的app在Xcode调试中, 所以确保测试启动性能时断开与Xcode的连接。

23)使用自动释放池
NSAutoreleasePool负责释放在代码块中的自动释放对象。通常,它是被UIKit自动调用的。但是也有一些场景我们需要手动创建NSAutoreleasePools。

举个例子,如果你创建太多的临时对象在你的代码中,你会注意到你的内存用量会增加直到对象被释放掉。问题是内存只有在UIKit排空(drains)自动释放池的时候才能被释放,这意味着内存被占用的时间超过了需要。
好消息是你可以在你的@autoreleasepool段中创建临时对象来避免上述情况。代码如下所示。

NSArray *urls = <# An array of file URLs #>; for (NSURL *url in urls) { @autoreleasepool { NSError *error; NSString *fileContents = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error]; /* Process the string, creating and autoreleasing more objects. */ }}

在每次迭代之后会自动释放所有的对象。

你可以阅读更多关于NSAutoreleasePool的内容.

24)缓存图像
这里有两种方法去加载app束中的Image,第一个常见的方式是用imageNamed. 第二个是使用imageWithContentsOfFile

为什么会有两种方法,它们有效率吗?

imageNamed 在载入时有缓存的优势。文档 是这样解释的:

这个方法看起来在系统缓存一个图像对象并指定名字,如果存在则返回对象,如果匹配图像的对象不在缓存中,这个方法会从指定的文件中加载数据,并缓存它,然后返回结果对象。

作为替代,imageWithContendsOfFile 简单的载入图像并不会缓存。

这两个方法的的演示片段如下:

UIImage *img = [UIImage imageNamed:@"myImage"]; // caching// UIImage *img = [UIImage imageWithContentsOfFile:@"myImage"]; // no caching

如果你加载只使用一次大图片,那就不需要缓存。这种情况imageWithContendsOfFile会非常好,这种方式不会浪费内存来缓存图片。什么时候使用哪一种呢?

然而,imageNamed 对于要重用的图片来说是更好的选择,这种方法节约了经常的从磁盘加载图片的时间。

25) 尽可能避免日期格式化器
如果你要用NSDateFormatter来解析日期数据,你就得小心对待了。之前提到过,尽量的重用NSDateFormatters总是一个好的想法。

 

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

相关文章
  • Java 下的 JSON库性能比较:JSON.simple vs. GSON vs. Jackson vs. JSONP

    Java 下的 JSON库性能比较:JSON.simple vs. GSON vs. Jackson vs. J

    2016-09-21 12:00

  • iOS 网络编程 (四)JSON解析

    iOS 网络编程 (四)JSON解析

    2016-09-19 10:00

  • JavaScript深化教程——sessionStorage和localStorage

    JavaScript深化教程——sessionStorage和localStorage

    2016-09-15 18:02

  • 25条提高iOS App性能的技巧和诀窍

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

    2016-09-14 13:00

网友点评