单例设计模式:在它的核心结构中只包含一个被称为单例类的特殊类。例如文件管理中的NSUserDefault,应用程序中的UIApplication,整个应用程序就这一个单例类,负责应用程序的一些操作,单例在那个文件下都能取得到。

通过单例设计模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节省系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的选择。

下面来点实在的,创建单例代码上

方法1:基于线程安全创建一个单例

.h做一下声明

 + (id)sharedInstanceBySynchronized;

.m实现一下单例类

 + (id)sharedInstanceBySynchronized
{
    static Instance *instance;
    //保证创建的单例线程安全
    @synchronized(self){
        if (instance==nil) {
            instance=[[self alloc] init ];
        }

}
    return instance;
}

 
这样就可以需要用到单例类的时候调用单例类的接口API,要先导入头文件才能使用
 
方法2:用GCD是对线程的高度封装,线程以后进一步详解
.h
 + (id)sharedInstanceByGCD;
.m
 //利用GCD手写单例
+ (id)sharedInstanceByGCD
{
    static Instance *instance;
    
    static dispatch_once_t onceToken;
    
    dispatch_once(&onceToken, ^{
        instance=[[self alloc ] init ];
    });
    return instance;
}
测试一下是不是正确产生了一个单例,就需要我们自己用代码测试,通过打印输出两个变量的地址,就知道是不是同一个单例类
  Instance *instance1=[Instance sharedInstanceByGCD];
    
    Instance *instance2=[Instance sharedInstanceByGCD];

NSLog(@"%@---%@",instance1,instance2);
    

打印输出instance1=instance2的地址,说明通过线程锁创建成功了单例
    Instance *instance3=[Instance sharedInstanceBySynchronized];

Instance *instance4=[Instance sharedInstanceBySynchronized];
    
        NSLog(@"%@---%@",instance3,instance4);

打印输出instance3=instance4的地址,说明通过GCD创建成功了单例
 
 2015-11-01 22:38:04.700 单例测试性能[746:28450] 11<Instance: 0x7f99c35170c0>---<Instance: 0x7f99c35170c0>
2015-11-01 22:38:04.700 单例测试性能[746:28450] 11<Instance: 0x7f99c3630d30>---<Instance: 0x7f99c3630d30>
两个单例的地址相同,创建单例成功
这里我们做一下拓展,测试一下两个单例的性能
 
代码如下:需要用到单例需导入单例的头文件
可以在本文件调用[self test1],[self test2],看一下时间差,就能知道性能的好坏
 - (void)test1
{
    long num=1000;
    CFAbsoluteTime start=CFAbsoluteTimeGetCurrent();
    for (int i=0; i<num; i++) {
        
        Instance *inst=[Instance sharedInstanceByGCD];
    }
    CFAbsoluteTime end=CFAbsoluteTimeGetCurrent();
    
    NSLog(@"test1:%f",end-start);

}
- (void)test2
{
    long num=1000;
    CFAbsoluteTime start=CFAbsoluteTimeGetCurrent();
    for (int i=0; i<num; i++) {
        
        Instance *ins=[Instance sharedInstanceBySynchronized];
    }
    CFAbsoluteTime end=CFAbsoluteTimeGetCurrent();
    
    NSLog(@"test2:%f",end-start);

}

2015-11-01 22:38:05.880 单例测试性能[746:28450] test1:0.000168
2015-11-01 22:38:05.880 单例测试性能[746:28450] test2:0.000319
2015-11-01 22:38:08.128 单例测试性能[746:28450] test1:0.000164
2015-11-01 22:38:08.128 单例测试性能[746:28450] test2:0.000327
 
从打印出来的数字可以看出GCD的单例优于Synchronized的性能

iOS 中的单例设计模式的更多相关文章

  1. IOS中的单例设计模式

    单例设计模式是IOS开发中一种很重要很常用的一种设计模式.它的设计原理是无论请求多少次,始终返回一个实例,也就是一个类只有一个实例.下面是苹果官方文档中关于单例模式的图片: 如图所示,左边的图是默认的 ...

  2. iOS开发之单例设计模式(完整正确版本)

    单例的意思从字面上就可以略知一二,所谓单例就是确保在程序运行过程中只创建一个对象实例.可以用于需要被多次广泛或者说多次使用的资源中,比如我们常见的网络请求类.工具类以及其它管理类等.比如我iOS开发中 ...

  3. iOS中编写单例类的心得

    单例 1.认识过的单例类有哪些: NSUserDefaults.NSNotificationCenter.NSFileManager.UIApplication 2.单例类 单例类某个类在代码编写时使 ...

  4. OC中的单例设计模式及单例的宏抽取

    // 在一个对象需要重复使用,并且很频繁时,可以对对象使用单例设计模式 // 单例的设计其实就是多alloc内部的allocWithZone下手,重写该方法 #pragma Person.h文件 #i ...

  5. Java中常用来处理时间的三个类:Date、Calendar、SimpleDateFormate,以及Java中的单例设计模式:懒汉式、饿汉式以及静态内部类式

    (一)java.util.Date类 1.该类有一个long类型的属性:用来存放时间,是用毫秒数的形式表示,开始的日期是从1970年1月1号 00:00:00.    2.该类的很多方法都已经过时,不 ...

  6. Python中的单例设计模式

    1)设计模式: 是前人工作的总结和提炼.通常,被人们广泛流传的设计模式.     某一问题的特定解决方案,使用设计模式是为了可重用代码,是代码更容易被人理解, 增加代码的可用性. 2)单例设计模式: ...

  7. iOS——Swift开发中的单例设计模式(摘译,非原创)

    最近在开发一个小的应用,遇到了一些Objective-c上面常用的单例模式,但是swift上面还是有一定区别的,反复倒来倒去发现不能按常理(正常的oc to swift的方式)出牌,因此搜索了一些帖子 ...

  8. iOS中的单例

    #import "Singleton.h" @implementation Singleton static Singleton *singleton = nil; + (Sing ...

  9. java中的单例设计模式

    单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供 ...

随机推荐

  1. Lua与.net的CLR相互调用

    工程环境搭建: 下载luainterface-1.5.3.zip文件,使用到的dll为Built目录下的LuaInterface.dll.lua51.dll.luanet.dll LuaInterfa ...

  2. Ubuntu下搭建FTP服务器

    Ubuntu下搭建FTP服务器 我装的服务器系统是Ubuntu 12.04 LTS,FTP软件当然是选择大名鼎鼎的vsftpd(very secure FTP daemon), 用系统自带的FTP还好 ...

  3. [编织消息框架][rpc]使用篇

    rpc 分两部份,一个是调用者,另一方是服务提供者 调用者只关心那个服务,传相应参数,返回内容就可以 而提供者根据调用相应服务同参数,工作处理后响应内容即可 根据他们的关系可以用JAVA 接口同实现类 ...

  4. iOS 访问URL转码

    访问URL时,需要对字符串进行转码: urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; ...

  5. Ionicons的使用

    安装 参考Ionicons npm install react-native-vector-icons --save 这时候可能会报错:npm WARN deprcated lodash@4.2.0: ...

  6. 【转】Java通过IText导出word和pdf

    原帖地址:http://blog.csdn.net/zwx19921215/article/details/34439851 最近做的项目中需要用到把Highcharts图表导出word和pdf的功能 ...

  7. 第23篇 js快速学习知识

    前面说了js的一些高级方面的基础知识,这些都是比较容易出错的和比较难理解的东西,除了这些之外其它的知识都比较简单了,基础学好了,扩展起来就是小意思.今天说说js方面可以快速学习和入门的知识. 1.闭包 ...

  8. ERP实施顾问工作中应努力做到哪些?

    1.树立并分享信誉 准确的为自己定位,并积极树立自己的信誉.从这样两个角度去考虑问题,一是从高层管理者的角度去思考行业竞争和公司运作的问题,一是从专业.细致的角度去考虑单据.报表.界面等数据处理的问题 ...

  9. 未来工厂——电器行业ERP案例

    江苏科兴电器有限公司位于全国著名的“银杏之乡”泰兴市南首,主要生产35kV及以下电流.电压互感器等系列产品.产品多次经国家及省市技术监督部门抽检合格,广泛应用于国家重点工程.“COSINE”商标荣获泰 ...

  10. Selenium 使用Eclipse+TestNG创建一个Project中遇到的问题

    继续之前的学习,对于一个没有太多计算机基础的人,刚学习selenium,最大的问题就是不知道该如何入手,最简单的办法就是录制脚本之后导入. 但是导入的时候也会出现一些问题,就是该导入到哪里?如何导入? ...