一句话实现单例模式

首先新建一个头文件,定义如下宏:

// .h文件的实现
#define SingletonH(methodName) + (instancetype)shared##methodName;

// .m文件的实现
#if __has_feature(objc_arc) // 是ARC
#define SingletonM(methodName) static id _instace = nil; + (id)allocWithZone:(struct _NSZone *)zone { if (_instace == nil) { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instace = [super allocWithZone:zone]; }); } return _instace; } - (id)init { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instace = [super init]; }); return _instace; } + (instancetype)shared##methodName { return [[self alloc] init]; } + (id)copyWithZone:(struct _NSZone *)zone { return _instace; } + (id)mutableCopyWithZone:(struct _NSZone *)zone { return _instace; }

#else // 不是ARC

#define SingletonM(methodName) static id _instace = nil; + (id)allocWithZone:(struct _NSZone *)zone { if (_instace == nil) { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instace = [super allocWithZone:zone]; }); } return _instace; } - (id)init { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instace = [super init]; }); return _instace; } + (instancetype)shared##methodName { return [[self alloc] init]; } - (oneway void)release { } - (id)retain { return self; } - (NSUInteger)retainCount { return 1; } + (id)copyWithZone:(struct _NSZone *)zone {     return _instace; }  + (id)mutableCopyWithZone:(struct _NSZone *)zone {     return _instace; }

#endif

然后在你定义单例类的

.h 文件 写 SingletonH(MyMethodName)

.m 文件写 SingletonM(MyMethodName)

搞定!

时间: 2024-08-07 00:17:55

一句话实现单例模式的相关文章

一句话实现OC单例模式

首先新建一个头文件,定义如下宏: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81

java/android 设计模式学习笔记(一)---单例模式

前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使用的时候也会有一些坑. PS:对技术感兴趣的同鞋加群544645972一起交流 设计模式总目录 java/android 设计模式学习笔记目录 特点 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的使用很广泛,比如:线程池(threadpool).缓存(cache).对

PHP设计模式之单例模式

一.什么是单例模式 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例.即一个类只有一个对象实例 单例模式的应用场景 通常用来数据库连接,日志写入等方面,为了减少资源浪费,减少数据库连接次数,节约资源,提高效率. 三.如何实现 要实现单例模式其实挺简单的,总结起来就一句话:三私一公,四个步骤: 1.私有化构造方法 2.声明一个公开的静态方法用来创建实例 3.声明一个私有的静态变量用来存储第二步创建的实例 4.私有化克隆方法

(一)单例模式详解

喜欢一句话"得按你想的去生活,否则,你迟早会按你的生活去想",软件设计也是这样,不能只停留在重复的写代码,否则,你迟早将被代码包围.应该去反复思考实践,整理出属于自己的代码仓库. 单例模式简述 确保一个类只有一个实例,并且提供一个全局的访问点. 单例类主要特征 如何创建一个单例类? 实例一 public class Singleton {    //一个静态的实例    private static Singleton singleton;    //私有化构造函数    privat

(1) 类构造块,this(),static,单例模式串讲

类构造块 在类只用一对大括号包含的内容,构造所有的对象时都会执行的内容,如果某个类有好几个够赞函数,公共部分抽取出来,放到构造块中. 1 clas Boy 2 { 3 ... 4 { 5 syso("哭..."); 6 } 7 ... 8 } 主要作用: 一个类可能重载了很多的构造函数,这时不同的构造函数有些内容是公共的,这时需要把公共的内容分离出来省的每个构造函数厘里面都写一遍,这时就可以使用类构造块. this() 这时一种在内部调用自己的空构造函数的做法.注意构造函数之间的相互调

创建型模式(四)单例模式

一句话的概要 一个类只有一个实例,并提供一个全局访问点. 剧情 上回说到,屌丝小明同学跟女神完成了第一次的约会.女神很高兴,小明正准备下一次约会的时候.女神另一个追求者小刚也打算约女神出去. 但是女神就一个人,面对两个人的追求,只能是选择一个.另一个人只能说,抱歉了. 我们就以上剧情,使用单例模式,来进行演示. 任务一:创建女神 我们用单例的方法创建女神类,并让他第一次约有空,剩下均没有空. public class Goddess { private Goddess() { Console.W

Android 单例模式探讨

Singleton模式可以是很简单的,它的全部只需要一个类就可以完成(看看这章可怜的UML图).但是如果在"对象创建的次数以及何时被创建"这两点上较真起来,Singleton模式可以相当的复杂,比头五种模式加起来还复杂,譬如涉及到DCL双锁检测(double checked locking)的讨论.涉及到多个类加载器(ClassLoader)协同时.涉及到跨JVM(集群.远程EJB等)时.涉及到单例对象被销毁后重建等. 目的: 希望对象只创建一个实例,并且提供一个全局的访问点. 图6.

大话设计模式笔记 组合模式 迭代模式 单例模式

组合模式(Composite),将对象组合合成树形以表示“部门整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 一句话说就是利用树这种数据结构储存对象. 迭代模式(Iterator),提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 数据结构内容. 单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问他的 全局访问点. efficient java 中已经详细介绍了

单例模式、双检测锁定DCL、volatile详解

单例模式最要关心的则是对象创建的次数以及何时被创建. Singleton模式可以是很简单的,它的全部只需要一个类就可以完成(看看这章可怜的UML图).但是如果在"对象创建的次数以及何时被创建"这两点上较真起来,Singleton模式可以相当的复杂,比头五种模式加起来还复杂,譬如涉及到DCL双锁检测(double checked locking)的讨论.涉及到多个类加载器(ClassLoader)协同时.涉及到跨JVM(集群.远程EJB等)时.涉及到单例对象被销毁后重建等.对于复杂的情况