zoukankan      html  css  js  c++  java
  • 利用dispatch_once创建单例

    利用dispatch_once创建单例

    使用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];

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

    原文链接:http://objcolumnist.com/2011/07/06/creating-singletons-using-dispatch_once/

  • 相关阅读:
    mysql索引
    struts升级2.3.12到2.5.13
    springboot使用servlet
    springboot拦截器
    开发复制内容
    Linux常用命令
    Eclipse中文语言包安装和设置中文
    eclipse编写代码所遇到的问题
    permission denied (publickey)问题的解决和向github添加ssh key
    工具
  • 原文地址:https://www.cnblogs.com/zhujin/p/3942068.html
Copyright © 2011-2022 走看看