美文网首页aa雨下思考
IOS性能优化三部曲-入门级

IOS性能优化三部曲-入门级

作者: 没能唱给你的歌曲 | 来源:发表于2016-04-27 21:44 被阅读215次
    1.用ARC管理内存

    ARC(Automatic Reference Counting, 自动引用计数)和iOS5一起发布,它避免了最常见的也就是经常是由于我们忘记释放内存所造成的内存泄露。它自动为你管理retain和release的过程,所以你就不必去手动干预了


    2.在正确的地方使用reuseldentifier

    不使用reuseldentifier的话,每显示一行tableview就不得不设置全新的cell,对性能影响相当大,尤其app的滚动体验不佳


    3.尽量把view设置为透明
    示例图.png

    如果你有透明的Views你应该设置它们的opaque属性为YES。
    原因是这会使系统用一个最优的方式渲染这些views。这个简单的属性在IB或者代码里都可以设定。
    Apple的文档对于为图片设置透明属性的描述是:
    (opaque)这个属性给渲染系统提供了一个如何处理这个view的提示。如果设为YES,渲染系统就认为这个view是完全不透明的,这使得渲染系统优化一些渲染过程和提高性能。如果设置为NO,渲染系统正常地和其它内容组成这个View。默认值是YES。
    在相对比较静止的画面中,设置这个属性不会有太大影响。然而当这个view嵌在scroll view里边,或者是一个复杂动画的一部分,不设置这个属性的话会在很大程度上影响app的性能。你可以在模拟器中用Debug\Color Blended Layers选项来发现哪些view没有被设置为opaque。目标就是,能设为opaque的就全设为opaque!


    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:方法来获取图片资源。


    5.不要阻塞主线程

    永远不要使主线程承担过多。因为UIKit在主线程上做所有工作,渲染,管理触摸反应,回应输入等都需要在它上面完成。
    一直使用主线程的风险就是如果你的代码真的block了主线程,你的app会失去反应。这。。。正是在App Store中拿到一颗星的捷径 :]
    大部分阻碍主进程的情形是你的app在做一些牵涉到读写外部资源的I/O操作,比如存储或者网络。
    你可以使用NSURLConnection异步地做网络操作:

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

    或者使用像 AFNetworking这样的框架来异步地做这些操作。
    如果你需要做其它类型的需要耗费巨大资源的操作(比如时间敏感的计算或者存储读写)那就用 Grand Central Dispatch,或者 NSOperation 和 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的 Multithreading and Grand Central Dispatch on iOS for Beginners, 还有 Soheil Azarpour 的 How To Use NSOperations and NSOperationQueues 教程。


    6.在Image Views中调整图片大小

    如果要在UIImageView中显示一个来自bundle的图片,你应保证图片的大小和UIImageView的大小相同。在运行中缩放图片是很耗费资源的,特别是UIImageView嵌套在UIScrollView中的情况下。
    如果图片是从远端服务加载的你不能控制图片大小,比如在下载前调整到合适大小的话,你可以在下载完成后,最好是用backgroundthread,缩放一次,然后在UIImageView中使用缩放后的图片


    7.选择正确的CollectionView

    学会选择对业务场景最合适的类或者对象是写出能效高的代码的基础。当处理collections时这句话尤其正确。
    Apple有一个 Collections Programming Topics 的文档详尽介绍了可用的classes间的差别和你该在哪些场景中使用它们。这对于任何使用collections的人来说是一个必读的文档。
    常见collection的总结:
    • Arrays: 有序的一组值。使用index来lookup很快,使用value lookup很慢, 插入/删除很慢。
    • Dictionaries: 存储键值对。 用键来查找比较快。
    • Sets: 无序的一组值。用值来查找很快,插入/删除很快。


    8.打开gzip压缩

    • 大量app依赖于远端资源和第三方API,你可能会开发一个需要从远端下载XML,JSON, HTML或者其它格式的app。
    • 问题是我们的目标是移动设备,因此你就不能指望网络状况有多好。一个用户现在还在edge网络,下一分钟可能就切换到了3G。不论什么场景,你肯定不想让你的用户等太长时间。
    • 减小文档的一个方式就是在服务端和你的app中打开gzip。这对于文字这种能有更高压缩率的数据来说会有更显著的效用。
    • 好消息是,iOS已经在NSURLConnection中默认支持了gzip压缩,当然AFNetworking这些基于它的框架亦然。像GoogleApp Engine这些云服务提供者也已经支持了压缩输出。

    相关文章

      网友评论

        本文标题:IOS性能优化三部曲-入门级

        本文链接:https://www.haomeiwen.com/subject/ncgcrttx.html