「这是我参与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教程。