单例设计模式:在它的核心结构中只包含一个被称为单例类的特殊类。例如文件管理中的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. 《经久不衰的Spring框架:@ResponseBody 中文乱码》

    问题背景 本文并不是介绍@ResponseBody注解,也不是中文乱码问题的大汇总笔记,这些网上都有很多内容了.这边仅对几年前,一个卡壳了挺久时间的问题的解决过程做一个记录,以警惕自己,达到自醒得目的 ...

  2. BZOJ 3926: [Zjoi20150]诸神眷顾的幻想乡(后缀自动机)

    被这道题坑了= =只与一个空地相连的空地不超过20个只与一个空地相连的空地不超过20个 因为很重要所以说两遍 就是说儿子节点最多只有20个 把这20个节点作为根遍历一遍所得到的tire所得到的所有不同 ...

  3. BZOJ 3403: [Usaco2009 Open]Cow Line 直线上的牛(模拟)

    直接双端队列模拟,完了= = CODE: #include<cstdio>#include<algorithm>#include<iostream>#include ...

  4. 令人费解的java泛型

         对于我们java中的泛型,可能很多人知道怎么使用并且使用的还不错,但是我认为想要恰到好处的使用泛型,还是需要深入的了解一下它的各种概念和内部原理.本文将尽可能的囊括java泛型中的重要的概念 ...

  5. 淘宝API调用 申请 获取session key

    在调用淘宝的API时,我们都会用到appkey,appsecret,appsession. 1.我们申请应用就会有appkey和appsecret了 2.正式环境下获取SessionKey 注意:we ...

  6. 剑指offer编程题Java实现——面试题11数值的整数次方

    题目: 实现函数double power(double base,int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 解题思路:最一般的方法实现数值 ...

  7. mysql view视图的简单使用....

    为什么使用视图 1.查询性能提高. 2.安全 3.有灵活性的功能需求后,需要改动表的结构而导致工作量比较大.那么可以使用虚拟表的形式达到少修改的效果 4.复杂的查询需求.可以进行问题分解,然后将创建多 ...

  8. 关于CSS各种选择器,还有各种引入样式表的区别,import导入样式表,在介绍一些伪类选择器

    (一)CSS选择器: 1.标签选择器:通过HTML的标签名直接选择该标签 2.类选择器:通过.选择器的名称{} 来对添加了class属性的标签进行选中 3.ID选择器:通过#选择器的名称{} 来对添加 ...

  9. oracle expdp和impdp常用命令选项

    一.expdp导出数据库 1.按用户导出 expdp scott/tiger@orcl DIRECTORY=oracle_dmp dumpfile=bak.dmp schemas=scott vers ...

  10. 跨专业学习编程的苦逼生活 QWQ嘤嘤嘤

    一串串小小的代码,竟然可以做出辣么多的东西,彻底颠覆了我的世界观.人生观.价值观. 话不多说,一个例子证明一切>>>> <!DOCTYPE html> <ht ...