在之前有一篇学习笔记中,记载了一篇如何在OC中实现单例的文章:《IOS学习笔记4—Objective C—创建单例》自苹果引入了Grand Central Dispatch (GCD)(Mac OS 10.6和iOS4.0)后,创建单例又有了新的方法,那就是使用dispatch_once函数,当然,随着演进的进行,还会有更多的更好的方法出现。今天就来简要介绍下如何利用dispatch_once创建单例。

在开发中我们会用到NSNotificationCenter、NSFileManager等,获取他们的实例通过[NSNotificationCenter defaultCenter]和[NSFileManager defaultManager]来获取,其实这就是单例。

我们先看下函数

void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);

其中第一个参数predicate,该参数是检查后面第二个参数所代表的代码块是否被调用的谓词,

第二个参数则是在整个应用程序中只会被调用一次的代码块。dispach_once函数中的代码块只会被执行一次,而且还是线程安全的。

接下来我们来实现自己的单例,这里有一个SchoolManager类,为这个类实现单例

  1. +(SchoolManager *)sharedInstance
  2. {
  3. static SchoolManager *sharedManager;
  4. static dispatch_once_t onceToken;
  5. dispatch_once(&onceToken, ^{
  6. sharedManager = [[SchoolManager alloc] init];
  7. });
  8. return sharedManager;
  9. }

到目前为止,我们就实现了一个单例,一切就搞定了,是不是很简单!

使用就按照如下方式获取唯一实例即可:

  1. SchoolManager *schoolManager = [SchoolManager sharedInstance];

以上就简单介绍了使用dispatch_once函数实现单例的方法,欢迎大家补充并讨论!

IOS:利用dispatch_once创建单例的更多相关文章

  1. IOS基础学习日志(七)利用dispatch_once创建单例及使用

    自苹果引入了Grand Central Dispatch (GCD)(Mac OS 10.6和iOS4.0)后,创建单例又有了新的方法,那就是使用dispatch_once函数,当然,随着演进的进行. ...

  2. 利用dispatch_once创建单例

     无论是爱还是恨,你都需要单例.实际上每个iOS或Mac OS应用都至少会有UIApplication或NSApplication. 什么是单例呢?Wikipedia是如此定义的: 在软件工程中,单例 ...

  3. iOS 转载一篇利用dispatch_once创建单例的文章

    感谢文章原作者,http://bj007.blog.51cto.com/1701577/649413

  4. IOS 使用dispatch_once 创建单例

    + (instantClass *)sharedClient { static instantClass *_sharedClient = nil; static dispatch_once_t on ...

  5. 使用GCD的dispatch_once创建单例

    使用GCD的dispatch_once创建单例 介绍了创建单例的方式,不过后来发现其实在ios 4.0后有更加简单的方式. 就是使用GCD的功能 代码如下: + (instantClass *)sha ...

  6. [iOS dispatch_once创建单例]

    自苹果引入了Grand Central Dispatch (GCD)(Mac OS 10.6和iOS4.0)后,创建单例又有了新的方法,那就是使用dispatch_once函数,当然,随着演进的进行, ...

  7. ios oc 和 swfit 用dispatch_once 创建单例

    网上已经有方法了,我这里就是抄了下,原文链接 http://bj007.blog.51cto.com/1701577/649413 http://blog.csdn.net/u010124617/ar ...

  8. 【iOS开发】创建单例的两种方法

    创建一个单例很多办法.我先列举一个苹果官方文档中的写法. [cpp] view plaincopy   static AccountManager *DefaultManager = nil; + ( ...

  9. iOS 创建单例的两种方法

    创建一个单例很多办法.我先列举一个苹果官方文档中的写法. [cpp] view plaincopy static AccountManager *DefaultManager = nil; + (Ac ...

随机推荐

  1. opencv获取图片sift特征

    利用opencv2.3来获取图片的sift特征,并输出到标准输出,可用重定向到文件. #include<cstdio> #include"opencv2/opencv.hpp&q ...

  2. ARM寄存器的8种寻址方式01

    一.立即数寻址 操作数由指令本身给出 MOV r0,#0x0F //是所有寻址方式里面速度最快的,但是受到合法立即数的限制 立即数要求以#和$开头 十六进制,#后跟0x:十进制,#后直接加:八进制,# ...

  3. 《CDN web加速代理》RHEL6

    CDN加速代理环境的测试:192.168.1.这个网段是可以上网的,2网段不可以上网 一台apache服务器 :配置 只安装apche服务 IP 192.168.1.59 一台双网卡的服务器 :只安装 ...

  4. 2.servlet 生命周期

    1.建Web project“2Servlet_Basic” 2.建包com.amaker.servlet 3.建类“ServletBasic.java” package com.amaker.ser ...

  5. 使用mysql关键字做类字段名报的错,花了我一个钟,坑啊

    com.modelsystem.po.ProjectPlan@701faaedHibernate: insert into ld.project_plan (addTime, describe, ex ...

  6. Win7构造wifi热点【Written By KillerLegend】

    1:Win+R打开DOS,输入以下命令然后回车,不要关闭该DOS窗口: netsh wlan set hostednetwork  mode = allow ssid =你的wifi热点名字  key ...

  7. kdbchk: the amount of space used is not equal to block size

    一.对数据文件检查 注意:应该在关闭数据库模式下进行bbed的操作 [oracle@ora10 controlfile]$ dbv file=/u01/app/oracle/oradata/ORCL/ ...

  8. python之域与属性

    python, javascript中域与属性是二个不同的概念, 域就是变量, 而属性则是符合某些约束, 例如getter, setter...等的特殊"变量". python中使 ...

  9. 使用PHP计算上一个月的今天

    一日,遇到一个问题,求上一个月的今天. 最开始我们使用 strtotime(“-1 month”) 函数求值,发现有一个问题,月长度不一样的月份的计算结果有误. 比如:2011-03-31,得到的结果 ...

  10. 在后台直接调用sql

    表:FmCashStatistics EFContext db = new EFContext(); string strsql = "SELECT org_info_id,customer ...