iOS应用性能调优的建议和技巧(三)

193 阅读3分钟

「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战」。

初学者性能提升

        该部分致力于一些能提高性能的基本改变。但所有开发者都有可能会忽视该部分下的一些建议。

4. 避免过于庞大的XIB文件

        iOS5中加入的Storyboards(分镜)正在快速取代XIB。然而XIB在一些场景中仍然很有用。比如你的app需要适应iOS5之前的设备,或者你有一个自定义的可重用的view,你就不可避免地要用到他们。**
**

        如果你不得不XIB的话,使他们尽量简单。尝试为每个Controller配置一个单独的XIB,尽可能把一个View Controller的view层次结构分散到单独的XIB中去。

        需要注意的是,当你加载一个XIB的时候所有内容都被放在了内存里,包括任何图片。如果有一个不会即刻用到的view,你这就是在浪费宝贵的内存资源了。Storyboards就是另一码事儿了,storyboard仅在需要时实例化一个view controller.

        当家在XIB是,所有图片都被chache,如果你在做OS X开发的话,声音文件也是。Apple在相关文档中的记述是:当你加载一个引用了图片或者声音资源的nib时,nib加载代码会把图片和声音文件写进内存。在OS X中,图片和声音资源被缓存在named cache中以便将来用到时获取。在iOS中,仅图片资源会被存进named caches。取决于你所在的平台,使用NSImage 或UIImage 的“imageNamed:”方法来获取图片资源。

        更多关于storyboards的内容:Storyboards Tutorial for iOS:  Part 1 和 Part 2

5. 不要阻塞主线程

        永远不要使主线程承担过多。因为UIKit在主线程上做所有工作,渲染,管理触摸反应,回应输入等都需要在它上面完成。一直使用主线程的风险就是如果你的代码真的阻塞了主线程,你的app会失去反应,这也许是在App Store中拿到一颗星的捷径。

        大部分阻碍主进程的情形是你的app在做一些牵涉到读写外部资源的I/O操作,比如存储或者网络请求操作。使用系统原生的存储,加载方式或者使用像AFNetworking这样的框架来异步地做这些操作。

        下面代码是使用GCD的模板

        dispatch_async(dispatch_get_global_queue(0, 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

                        // 任何UIKit相关的代码需要在此处进行

                });

        });

        如果你需要做其它类型的需要耗费巨大资源的操作(比如时间敏感的计算或者存储读写)那就用 Grand Central Dispatch,或者 NSOperation 和 NSOperationQueues.

        如果你对 NSOperation 或者GCD 的细节感兴趣的话,看看Ray Wenderlich的Multithreading and Grand Central Dispatch on iOS for Beginners, 还有 Soheil Azarpour 的How To Use NSOperations and NSOperationQueues教程。