iOS 的单例模式 dispatch_once

有些变量仅仅须要初始化一次(如从文件里读取配置參数。读取设备型号等等),能够使用dispatch_once来进行读取优化。保证仅仅调用API一次,以后就仅仅要直接訪问变量就可以.

WeatherClient.h

#import "AFHTTPClient.h"



@interface WeatherClient : AFHTTPClient



+(WeatherClient *)sharedClient;



@end

WeatherClient.m

#import "WeatherClient.h"



@implementation WeatherClient



+(WeatherClient *)sharedClient

{

    static WeatherClient *sharedClient=nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken,^{sharedClient =[[WeatherClient alloc] initWithBaseURL:[NSURL URLWithString:API]];

    });

    return sharedClient;

}

@end

在软件project中,单例是一种用于实现单例的数学概念,即将类的实例化限制成仅一个对象的设计模式。
或者我的理解是:
单例是一种类。该类仅仅能实例化一个对象。

    虽然这是单例的实际定义,但在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];

    有些时候你希望有这样的行为,但假设正在想要的是仅一个实例被实例化就须要注意这点。

 

iOS 的单例模式 dispatch_once的更多相关文章

  1. iOS开发单例模式 dispatch_once

    什么是单例 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源 ...

  2. iOS开发--单例模式

    单例模式在iOS开发中可能算是最常用的模式之一了,但是由于oc本身的语言特性,想要写一个正确的单例模式相对来说比较麻烦,这里我就抛砖引玉来聊一聊iOS中单例模式的设计思路.关于单例模式更多的介绍请参考 ...

  3. QF——iOS的单例模式

    iOS的单例模式: 单例,即为单个实例,确保一个类里只有一个实例,向整个系统提供一个唯一的实例. 甚至为了严格提供唯一的实例,通常只允许该类自己提供实例化的方法,不允许出现其他入口.这时我们通常得重写 ...

  4. 【iOS】单例模式

    单例模式在软件开发中经常用到,在iOS系统framework也很多地方用到单例模式,例如 [NSUserDefaults standardUserDefaults], [NSBundle mainBu ...

  5. iOS设计模式-单例模式

    (一)什么是单例模式(Singleton) 单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点 *最初的定义是在<设计模式>(Addison-Wesley)中 解读 1> ...

  6. Objective-C(iOS)严格单例模式正确实现

    注:本文所有权归作者所有,转载请注明出处 当希望在一个应用程序中某个类的对象只能存在一个的时候就可以考虑用单例模式来实现,单例模式在C++中比较容易实现(只需把构造函数声明为private),而在Ob ...

  7. ios之单例模式

    原帖地址:http://www.galloway.me.uk/tutorials/singleton-classes/ 本文为博主自行翻译,转载请注明出处:http://blog.csdn.net/i ...

  8. iOS开发-单例模式的解读

    现在网上的有很多人写单例模式,一个很基本的东西但是版本也有很多,新人看了难免有些眼花缭乱的感觉.自己最新比较闲,也过来写一些自己的心得. 在往下看之前,我们要明白一点,那就是在什么情况下我们才要用到单 ...

  9. iOS设计模式——单例模式

    单例模式用于当一个类只能有一个实例的时候, 通常情况下这个“单例”代表的是某一个物理设备比如打印机,或是某种不可以有多个实例同时存在的虚拟资源或是系统属性比如一个程序的某个引擎或是数据.用单例模式加以 ...

随机推荐

  1. 【日常总结】scrollTop、scrollHeight与clientHeight的重要关系

    前言 在做一个需求的时候涉及懒加载,百度了一下,发现scrollTop.scrollHeight与clientHeight这三个元素起到了重要作用,以前做过类似demo但是时间过太久忘记了,现在已经完 ...

  2. Python学习日记之练习代码

    # -*- coding:utf-8 -*- number = 23 test=True while test: guess=int(raw_input('输入数字')) if guess==numb ...

  3. spring中配置数据源

    spring中配置数据源的几种常见方式: #mysql 数据库配置(jdbc.properties) jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.u ...

  4. Java软件开发中迭代的含义

    软件开发中,各个开发阶段不是顺序执行的,而各个阶段都进行迭代并行执行的,然后在进入下一个阶段的开发. 这样对于开发中的需求变化,及人员变动都能得到更好的适应. 软件开发过程汇总迭代模型如下图所示:

  5. Swift mutating Equatable Hashable 待研究

    Swift mutating Equatable Hashable 待研究

  6. 梦想CAD控件安卓界面控制

    CAD控件界面上所有元素都可以控制显示或隐藏,下面将逐一介绍详细用法. 设置工具文件 MxFunction.setToolFile 设置工具文件.详细说明如下: 参数 说明 String sFile ...

  7. HDU5834 Magic boy Bi Luo with his excited tree (树形DP)

    题意:一棵树有点权和边权 从每个点出发 走过一条边要花费边权同时可以获得点权 边走几次就算几次花费 点权最多算一次 问每个点能获得的最大价值 题解:好吧 这才叫树形DP入门题 dp[i][0]表示从i ...

  8. Mkdocs在html网页上看markdown

    目录 Mkdocs在html网页上看markdown 1. 本文目的 2. Mkdocs介绍 3. DEMO的演示 3.1 配置需求 3.2 安装mkdocs 3.3 新建工程 3.4 启动服务器 3 ...

  9. Extjs查询实现

    效果图如上: 页面代码: Ext.QuickTips.init(); //放在图标上会自动提示信息 Ext.define('ExtApp.view.StudentList' , { extend : ...

  10. <SpringMvc>入门四 响应结果

    1.响应String类型 根据试图解析器,去找相对应的jsp Model将对象存在request中 2.响应void类型 可以看出,此时void方法执行了,系统默认会去找testVoid.jsp 意思 ...