单例设计模式:在它的核心结构中只包含一个被称为单例类的特殊类。例如文件管理中的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. Docker网络代理设置

    背景 在一些实验室环境,服务器没有直接连接外网的权限,需要通过网络代理.我们通常会将网络代理直接配置在/etc/environment./etc/profile之类的配置文件中,这对于大部分操作都是可 ...

  2. Webpack学习系列(二)

    一: 安装: npm install webpack-dev-server -g npm install webpack-dev-server --save (下载到当前文件夹) npm instal ...

  3. BZOJ 3653: 谈笑风生(DFS序+可持久化线段树)

    首先嘛,还是太弱了,想了好久QAQ 然后,这道题么,明显就是求sigma(size[x]) (x是y的儿子且层树小于k) 然后就可以发现:把前n个节点按深度建可持久化线段树,就能用前缀和维护了 其实不 ...

  4. 【Zookeeper】源码分析之请求处理链(三)

    一.前言 在分析了PrepRequestProcessor处理器后,接着来分析SyncRequestProcessor,该处理器将请求存入磁盘,其将请求批量的存入磁盘以提高效率,请求在写入磁盘之前是不 ...

  5. NSIndexSet 浅析

    Cocoa 中提供了两个用于维护区间集合的类型:NSIndexSet和NSMutableIndexSet . 这两个类型容易其名字一样,其区别就在于是否可以修改.这个区别和NSArray的一样,NSI ...

  6. spring中对象的注入方式

    平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...

  7. Oracle 一些简单操作

    登录oracle 以root用户切换到oracle数据库用户:su - oracle 输入sqlplus /nolog 不连接任何数据库 conn /as sysdba 用sysdba登录 start ...

  8. .NET中的repeater简介及分页效果

    Repeater控件是一个数据绑定容器控件,它能够生成各个项的列表,并可以使用模板定义网页上各个项的布局.当该页运行时,该控件为数据源中的每个项重复此布局.  配合模板使用repeater控件 若要使 ...

  9. .NET Core 1.1日期解析无APi、SQL Server数据转换JSON

    前言 在批量导入Excel中的数据时发现出生日期为整数也就是为天数,结果倒腾了翻,这是其一,其二是数据库中的某一列存的是JSON数据,但是场景是为了作为作业来运行,此时不得不将筛选出的数据手动拼接成J ...

  10. Macaca 自动化框架 [Python 系列]

    介绍 Macaca是一套完整的自动化测试解决方案,基于node.js开发.由阿里巴巴公司开源: 地址:http://macacajs.github.io/macaca/ 特点: 同时支持PC端和移动端 ...