懒汉式单例模式

下面的代码块, 基本是单例模式的完整版本了.

可扩展的地方,可以在init方法中作扩展.

 // static 在全局变量的作用域仅限于当前文件内部
static id _instance; /**
* alloc方法内部会调用这个方法 , zone是代表内存块的意思
*/
+ (id)allocWithZone:(struct _NSZone *)zone
{
// 首先判断防止频繁加锁 , 如果不判断,每次进来先加锁在判断
if (_instance == nil) {
// 只有第一次为空得时候才进来, 然后加锁. 必须加锁, 防止多线程同时操作同一变量
@synchronized(self) {
// 某条线程进来之后, 首先判断变量是否为空,如果为空,才执行下面语句
if (_instance == nil) {
// 内部默认做法,调用父类方法分配内存空间
_instance = [super allocWithZone:zone];
}
}
} // 直接返回对象
return _instance;
} /**
* 单例模式应该实现一个方法,让别人调用创建,并且创建无数次都应该是同一个对象
*
*/
+ (instancetype)sharedTool
{
if (_instance == nil) { // 防止频繁加锁
@synchronized(self) {
if (_instance == nil) { // 防止创建多次
// alloc 又会调用上面的allocWithZone方法
_instance = [[self alloc] init];
}
}
}
return _instance;
} // 应该提供该方法, 防止以后别人需要用copy得时候,也保证创建出来的对象是同一对象
- (id)copyWithZone:(NSZone *)zone
{
return _instance;
}

GCD 单例模式

// 用来保存唯一的单例对象, 同样也要加上static,防止别人能修改该字段
static id _instace; /**
*
*/
+ (id)allocWithZone:(struct _NSZone *)zone
{
/**
* dispatch_once只会执行一次,而且内部自动封装了锁,更简便安全
*/
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instace = [super allocWithZone:zone];
});
return _instace;
} + (instancetype)sharedDataTool
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instace = [[self alloc] init];
});
return _instace;
} /**
* 防止Copy创建对象
*/
- (id)copyWithZone:(NSZone *)zone
{
return _instace;
}

宏实现单例

新建一个.h文件,将下列代码复制进去.即可生成一个单例模式文件

 // .h文件
#define HMSingletonH(name) + (instancetype)shared##name; // .m文件
#if __has_feature(objc_arc) #define HMSingletonM(name) \
static id _instace; \
\
+ (id)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instace = [super allocWithZone:zone]; \
}); \
return _instace; \
} \
\
+ (instancetype)shared##name \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instace = [[self alloc] init]; \
}); \
return _instace; \
} \
\
- (id)copyWithZone:(NSZone *)zone \
{ \
return _instace; \
} #else #define HMSingletonM(name) \
static id _instace; \
\
+ (id)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instace = [super allocWithZone:zone]; \
}); \
return _instace; \
} \
\
+ (instancetype)shared##name \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instace = [[self alloc] init]; \
}); \
return _instace; \
} \
\
- (id)copyWithZone:(NSZone *)zone \
{ \
return _instace; \
} \
\
- (oneway void)release { } \
- (id)retain { return self; } \
- (NSUInteger)retainCount { return ;} \
- (id)autorelease { return self;} #endif

以上三种都是可运用的单例模式

单例模式是什么?

-> 单例模式是确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类

单例模式的作用?

-> 可以保证在程序运行过程, 一个类只有一个实例,而且该实例易于供外界访问,从而方便地控制了实例的个数,并节约系统资源

单例模式的使用场合?

-> 整个应用程序中, 共享一份资源,或者这份资源只需要创建初始化1次.

例如 : 一些工具类,(使用到项目各个地方,并且一般只有一份.)

: 例如一个注册的页面, 点击注册跳到注册页面.但是如果这个时候,再点击注册,我们希望一般都是进到同一个注册的页面,所以,这里应该就使用单例模式.

【单例模式】单例模式 & GCD单例模式 & 将封装单例模式到宏的更多相关文章

  1. 单例模式-用GCD实现

    用GCD实现单例模式的步骤: 步骤1. 创建头文件 XZSingleton.h,里面代码如下: // .h文件 #define XZSingletonH(name) + (instancetype)s ...

  2. 单例模式——使用GCD实现单例模式 & 非ARC单例模式 &使用GCD和线程锁实现单例模式-b

    1.单利模式概述 链接:  iOS开发懒汉模式&恶寒模式 2.使用GCD实现单利模式 2.1新建一个project,然后新建一个HMDataTool类展示GCD实现单例模式 #import & ...

  3. Java与设计模式之单例模式(下) 安全的单例模式

          关于单例设计模式,<Java与设计模式之单例模式(上)六种实现方式>介绍了6种不同的单例模式,线程安全,本文介绍该如何保证单例模式最核心的作用——“实现该模式的类有且只有一个实 ...

  4. GCD的简单封装

    扩展: dispatch_block_t :无参数block,使用起来很简单 下载链接:http://pan.baidu.com/s/1bndN6Yb    ]; }     //定时器 - (voi ...

  5. iOS中常见的设计模式——单例模式\委托模式\观察者模式\MVC模式

    一.单例模式 1. 什么是单例模式? 在iOS应用的生命周期中,某个类只有一个实例. 2. 单例模式解决了什么问题? 想象一下,如果我们要读取文件配置信息,那么每次要读取,我们就要创建一个文件实例,然 ...

  6. Javascript单例模式概念与实例

    前言 和其他编程语言一样,Javascript同样拥有着很多种设计模式,比如单例模式.代理模式.观察者模式等,熟练运用Javascript的设计模式可以使我们的代码逻辑更加清晰,并且更加易于维护和重构 ...

  7. 【白话设计模式四】单例模式(Singleton)

    转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...

  8. Net设计模式实例之单例模式( Singleton Pattern)

    一.单例模式简介(Brief Introduction) 单例模式(Singleton Pattern),保证一个类只有一个实例,并提供一个访问它的全局访问点.单例模式因为Singleton封装它的唯 ...

  9. 【转】单例模式(Singleton)

    首先来明确一个问题,那就是在某些情况下,有些对象,我们只需要一个就可以了, 比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个, 这里就可以通过单例模式来避免两个打印作业同时输 ...

随机推荐

  1. DisableExplicitGC和Direct ByteBuffer

    直接堆外内存请参见:http://blog.csdn.net/lantian0802/article/details/39257087 JVM调优请参见:http://hllvm.group.itey ...

  2. JMS - Exceptions

    The JMSException JMS defines JMSException as the root class for exceptions thrown by JMS methods. JM ...

  3. ScrollView 与ListView 滑动冲突完美解决

    一.介绍ListView高度的设置方法 二.根据实际需求解决冲突问题 一.介绍ListView高度的设置方法 在ScrollView中使用ListView,ListView的高度会不正常. 方式一:在 ...

  4. IOS 解析XML--使用NSXML

    一.解析文档顺序触发的函数 1.parserDidStartDocument,在文档的时候触发. 2.parser:didStartElement:namespaceURI:qualifiedName ...

  5. (转)在SQL中取出字符串中数字部分或在SQL中取出字符部分

    近来在开发一个项目时,一包含数字的字符串,需要取出中间的数字部分进行排序.经过baidu搜索.并结合自己项目的需求,编写了一个自定义的SQL函数用供项目中使用. /****** Object: Use ...

  6. (转)理解SQL SERVER中的分区表

    简介 分区表是在SQL SERVER2005之后的版本引入的特性.这个特性允许把逻辑上的一个表在物理上分为很多部分.而对于SQL SERVER2005之前版本,所谓的分区表仅仅是分布式视图,也就是多个 ...

  7. java synchronized关键字

    引用其他人的一段话 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchro ...

  8. mouseover,mouseout,mouseenter,mouseleave的区别

    相信做前端开发的都听说过“冒泡型事件”吧,<JavaScript高级程序设计>第九章有详细的讲述,但是,在学习的时候一知半解,也没详细去理解,导致最近在工作中碰到了问题:有许多 li 标签 ...

  9. OpenCV基本架构[OpenCV 笔记0]

    最近正在系统学习OpenCV,将不定期发布笔记,主要按照毛星云的<OpenCV3编程入门>的顺序学习,会参考官方教程和文档.学习工具是Xcode+CMake,会对书中一部分内容更正,并加入 ...

  10. template_1

    0: 模板是一些为多种类型而编写的函数和类,而且这些类型都没有指定.当使用模板的时候,只需要把所希望的类型作为一个(显示或隐示的)实参传递给模板.模板是语言本身所具有的特效,她完全支持类型检查和作用域 ...