dispatch_once优化代码性能 转

有些变量只需要初始化一次(如从文件中读取配置参数,读取设备型号等等),可以使用dispatch_once来进行读取优化,保证只调用API一次,以后就只要直接访问变量即可

范例如下:


  1. static BOOL isTestMode;
  2. + (BOOL)isTestMode

  3. {

  4. static dispatch_once_t onceToken;

  5. dispatch_once(&onceToken, ^{

  6. NSNumber* obj = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFResourceTest"];

  7. isTestMode = [obj boolValue];

  8. });
  9. return isTestMode;

  10. }

  11. 无论是爱还是恨,你都需要单例。实际上每个iOS或Mac OS应用都至少会有UIApplication或NSApplication.

  12. 什么是单例呢?Wikipedia是如此定义的:

    在软件工程中,单例是一种用于实现单例的数学概念,即将类的实例化限制成仅一个对象的设计模式。

    或者我的理解是:

    单例是一种类,该类只能实例化一个对象。

    尽管这是单例的实际定义,但在Foundation框架中不一定是这样。比如NSFileManger和NSNotificationCenter,分别通过它们的类方法defaultManager和defaultCenter获取。尽管不是严格意义的单例,这些类方法返回一个可以在应用的所有代码中访问到的类的共享实例。在本文中我们也会采用该方法。

    使用Objective-C实现单例模式的最佳方式向来有很多争论,开发者(包括Apple在内)似乎每几年就会改变他们的想法。当Apple引入了Grand Central Dispatch (GCD)(Mac OS
    10.6和iOS4.0),他们也引入了一个很适合用于实现单例模式的函数。

    该函数就是dispatch_once:

    void dispatch_once( dispatch_once_t *predicate, dispatch_block_t
    block);

    该函数接收一个dispatch_once用于检查该代码块是否已经被调度的谓词(是一个长整型,实际上作为BOOL使用)。它还接收一个希望在应用的生命周期内仅被调度一次的代码块,对于本例就用于shared实例的实例化。

    dispatch_once不仅意味着代码仅会被运行一次,而且还是线程安全的,这就意味着你不需要使用诸如@synchronized之类的来防止使用多个线程或者队列时不同步的问题。

    Apple的GCD Documentation证实了这一点:

    如果被多个线程调用,该函数会同步等等直至代码块完成。

    实际要如何使用这些呢?

    好吧,假设有一个AccountManager类,你想在整个应用中访问该类的共享实例。你可以按如下代码简单实现一个类方法:

    + (AccountManager *)sharedManager

       static AccountManager
    *sharedAccountManagerInstance = nil; 
     static
    dispatch_once_t predicate;


    dispatch_once(&predicate,
    ^{       
             sharedAccountManagerInstance
    = [[self alloc]
    init]; 
        });

    return
    sharedAccountManagerInstance; 
    }

    这就意味着你任何时候访问共享实例,需要做的仅是:

    AccountManager *accountManager = [AccountManager
    sharedManager];

    就这些,你现在在应用中就有一个共享的实例,该实例只会被创建一次。

    该方法有很多优势:

    1 线程安全

    2
    很好满足静态分析器要求

    3
    和自动引用计数(ARC)兼容

    4
    仅需要少量代码

    该方法的劣势就是它仍然运行创建一个非共享的实例:

    AccountManager *accountManager = [[AccountManager alloc]
    init];

    有些时候你希望有这种行为,但如果正在想要的是仅一个实例被实例化就需要注意这点。

dispatch_once优化代码性能 转,布布扣,bubuko.com

时间: 2024-07-29 07:33:00

dispatch_once优化代码性能 转的相关文章

不得不看的Java代码性能优化总结

前言 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了.代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨:但是如果有足够的时间开发.维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的. 代码优化的目标是:

C++ 代码性能优化 -- 循环分割提高并行性

对于一个可结合和可交换的合并操作来说,比如整数的加法或乘法, 我们可以通过将一组合并操作分割成 2 个或更多的部分,并在最后合并结果来提高性能. 原理: 普通代码只能利用 CPU 的一个寄存器,分割后可以利用多个寄存器. 当分割达到一个数量时,寄存器用完,性能不再提升,甚至会开始下降. 用代码来描述,如下: // 一般情况下的代码 for (i = 1; i < n+1; i++) { res = res OPER i; } // 循环分割后代码 for (i = 1; i < n; i+=2

Java代码性能优化技巧

流方面: private FileOutputStream writer; writer = new FileOoutputStream(fileName); 使用BufferedOutputStream 对写入FileOutputStream的数据进行缓存 //将writer的类型由FileOutputStream 变更为BufferedOutputStream //private FileOutputStream writer; private BufferedOutputStream wr

Android 性能优化:使用 Lint 优化代码、去除多余资源

读完本文你将了解到: 前言 什么是 Lint Lint 工作方式简单介绍 从命令行运行 Lint Android Studio 中使用 Lint 团队中建立代码规范利器提升降低问题的等级 Lint 虽好也不能贪杯 在 Java 代码中忽略 Lint 警告 在 XML代码中忽略 Lint 警告 Gradle 中配置 Lint 自动删除查找出来的无用资源文件 总结 Thanks 前言 在保证代码没有功能问题,完成业务开发之余,有追求的程序员还要追求代码的规范.可维护性. 今天,以"成为优秀的程序员&

Java 代码性能优化总结

35 个 Java 代码性能优化总结 前言 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了.代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨:但是如果有足够的时间开发.维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率

关于前端代码性能优化问题

以下观点纯属个人看法: 对于一个刚接触前端不久的人来说,前端的代码质量是很重要的一部分,毕竟关系到性能问题.个人认为关于代码性能优化主要由这几方面:HTML.CSS.Javascript和HTTP,所以对这四个方面的优化能提高浏览器的性能.个人知识面有限,只有学到以下的知识,另外的还没涉及,不足之处还请体谅. 一. HTML 1.首先是对HTML5的充分熟悉和理解,理解标签的语义化,减少对标签的重定义. 2.命名的规范化,对id.class.name的规范命名有助于整体代码的构建,方便他人的理解

Python 代码性能优化技巧(转)

原文:Python 代码性能优化技巧 Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化.扩展以及文档相关的事情通常需要消耗 80% 的工作量.优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率. 改进算法,选择合适的数据结构 一个良好的算法能够对性能起到关键作用,因此性能改进的首要点是对算法的改进.在算法的时间复杂度排序上依次是: O(1) -> O(lg n) -> O(

js代码性能优化的几个方法

相信写代码对于大部分人都不难,但想写出高性能的代码就需要一定的技术积累啦,下面是一些优化JavaScript代码性能的常见方法. 一.注意作用域 1.避免全局查找 使用全局变量和函数肯定要比局部的开销更大,因为要涉及作用域链上的查找,请看以下函数: 1 function demo1() { 2 var imgs = document.getElementByTagName("img"); //获取页面所有img标签 3 4 for(var i = 0; i <= imgs.len

Android代码性能优化技巧 (一)

转载自 http://blog.csdn.net/leilu2008/article/details/6672979 我们大家都知道Android 2.2的JIT性能有了本质的提高,不过对于老版本的程序提高Java执行效率还有很多语言特点来说,对于Java 1.5之后将会有明显的改进.下面的例子来自SDK: [java] view plaincopy static class Foo { int mSplat; } Foo[] mArray = ... //上面的静态类Foo的执行效果和性能,我