iOS应用性能调优的25个建议和技巧(22~25)

22.加速启动时间

快速打开app是很重要的,特别是用户第一次打开它时,对app来讲,第一印象太太太重要了。

你能做的就是使它尽可能做更多的异步任务,比如加载远端或者数据库数据,解析数据。

还是那句话,避免过于庞大的XIB,因为他们是在主线程上加载的。所以尽量使用没有这个问题的Storyboards吧!

注意,用Xcode debugwatchdog并不运行,一定要把设备从Xcode断开来测试启动速度

 

23.使用AutoreleasePool

`NSAutoreleasePool`负责释放block中的autoreleased objects。一般情况下它会自动被UIKit调用。但是有些状况下你也需要手动去创建它。

假如你创建很多临时对象,你会发现内存一直在减少直到这些对象被release的时候。这是因为只有当UIKit用光了autorelease pool的时候memory才会被释放。

好消息是你可以在你自己的@autoreleasepool里创建临时的对象来避免这个行为:

1

2

3

4

5

6

7

8

9

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. */

    }

}

 

这段代码在每次遍历后释放所有autorelease对象

更多关于NSAutoreleasePool请参考官方文档

 

24.选择是否缓存图片

常见的从bundle中加载图片的方式有两种,一个是用`imageNamed`,二是用`imageWithContentsOfFile`,第一种比较常见一点。

既然有两种类似的方法来实现相同的目的,那么他们之间的差别是什么呢?

`imageNamed`的优点是当加载时会缓存图片。`imageNamed`的文档中这么说:
这个方法用一个指定的名字在系统缓存中查找并返回一个图片对象如果它存在的话。如果缓存中没有找到相应的图片,这个方法从指定的文档中加载然后缓存并返回这个对象。

相反的,`imageWithContentsOfFile`仅加载图片。

下面的代码说明了这两种方法的用法:

1

2

3

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

 // or

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

 

那么我们应该如何选择呢?

如果你要加载一个大图片而且是一次性使用,那么就没必要缓存这个图片,用`imageWithContentsOfFile`足矣,这样不会浪费内存来缓存它。

然而,在图片反复重用的情况下`imageNamed`是一个好得多的选择。

 

25.避免日期格式转换

如果你要用`NSDateFormatter`来处理很多日期格式,应该小心以待。就像先前提到的,任何时候重用`NSDateFormatters`都是一个好的实践。

然而,如果你需要更多速度,那么直接用C是一个好的方案。Sam Soffes有一个不错的帖子(http://soff.es/how-to-drastically-improve-your-app-with-an-afternoon-and-instruments)里面有一些可以用来解析ISO-8601日期字符串的代码,简单重写一下就可以拿来用了。

嗯,直接用C来搞,看起来不错了,但是你相信吗,我们还有更好的方案!

如果你可以控制你所处理的日期格式,尽量选择Unix时间戳。你可以方便地从时间戳转换到NSDate:

1

2

3

- (NSDate*)dateFromUnixTimestamp:(NSTimeInterval)timestamp {

 return[NSDate dateWithTimeIntervalSince1970:timestamp];

 }

 

这样会比用C来解析日期字符串还快!

需要注意的是,许多web API会以微秒的形式返回时间戳,因为这种格式在JavaScript中更方便使用。记住用`dateFromUnixTimestamp`之前除以1000就好了。

更多阅读

下列这些WWDC视频强烈推荐给想要提高app性能的开发者。你首先需要保证你有使你的Apple ID注册为一个开发者身份才能看在这里看WWDC2012的视频

·      #406:Adopting Automatic Reference Counting

·      #238:iOS App Performance: Graphics and Animations

·      #242:iOS App Performance: Memory

·      #235:iOS App Performance: Responsiveness

·      #409:Learning Instruments

·      #706:Networking Best Practices

·      #514:OpenGL ES Tools and Techniques

·      #506:Optimizing 2D Graphics and Animation Performance

·      #601:Optimizing Web Content in UIWebViews and Websites on iOS

·      #225: Upand Running: Making a Great Impression with Every Launch

一些01年的WWDC视频也很有价值:

·      #308:Blocks and Grand Central Dispatch in Practice

·      #323:Introducing Automatic Reference Counting

·      #312:iOS Performance and Power Optimization with Instruments

·      #105:Polishing Your App: Tips and tricks to improve the responsiveness andperformance

·      #121:Understanding UIKit Rendering

其它一些值得看的视频,大部分来自iOS 5 Tech Talks

·      Your iOSApp Performance Hitlist

·      OptimizingApp Performance with Instruments

·      UnderstandingiOS View Compositing

基于《Your iOS App Performance Hitlist》这个Michael Jurewitz的视频,Ole Begemann写了一篇文字总结的文章

Apple提供了一个非常有用的叫做Performance Tuning | 性能调优的资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值