单例设计模式:在它的核心结构中只包含一个被称为单例类的特殊类。例如文件管理中的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. MongoDB学习总结(一) —— Windows平台下安装

    > 基本概念 MongoDB是一个基于分布式文件存储的开源数据库系统,皆在为WEB应用提供可扩展的高性能数据存储解决方案.MongoDB将数据存储为一个文档,数据结构由键值key=>val ...

  2. php上线教程----阿里云下设值二级域名并将项目上线

    在工作中,我们需要在一个主机地址下分配多个域名来上线多个项目,但是怎么设置一个二级域名并且完成上线项目的,接下来我们就以阿里云为例演示整个上线流程 首先登陆你的阿里云,找到你的域名 点击解析,进入解析 ...

  3. JS作用域理解

    1.JS解析步骤: a.预解析 将变量声明提升: 将函数声明及函数内容提升,可以理解成原来位置的函数在解析代码时已经提到代码初始位置: 遇到重名,只留下一个: 如有重名变量和函数,留下函数: 如有两个 ...

  4. [译]如何在Web开发中使用Python

    [译]如何在Web开发中使用Python 原文:HOWTO Use Python in the Web 摘要 这篇文档展示了Python如何融入到web中.它介绍了几种Python结合web服务器的方 ...

  5. ldd获得可执行程序的所有库并输出到指定目录

    #!/bin/bash ########################################################################## #ldd可以查看程序的库依 ...

  6. 一个基于注解的orm简单实现(二):实现思路

    先来看一段常见的数据库操作代码: ``` protected User getDataFromDatabase(long id){ String sql = "select firstnam ...

  7. 【CNMP系列】CNMP之路,系统起步。

    简单的来理解,我所说的CNMP,不是CNM+P,而是CentOs+Nginx+MySql+PHP,也可以单纯的理解为LNMP,但是系统是我们自己选的,虽说是Linux的一个分支,但我就喜欢CentOs ...

  8. AR入门系列-在vuforia官网的使用-01-史上最详细AR入门教程

    使用高通的vuforiaSDK 网址:https://developer.vuforia.com/ 我们想要使用vuforia首先得注册一个账号 网站会发送邮件给你的邮箱 点击验证链接,验证邮箱 出现 ...

  9. Java基本数据类型及其封装器的一些千丝万缕的纠葛

    一些概念     想必大家都知道Java的基础数据类型有:char.byte.short.int.long.float.double.boolean 这几种,与C/C++等语言不同的是,Java的基础 ...

  10. 初探nginx负载均衡集群

    借LVS的环境: A(dir):192.168.122.129 B(rs1):192.168.122.140 C(rs2):192.168.122.141 Centos 6下如果安装过epel的yum ...