(一)什么是单例模式(Singleton)

单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点 *最初的定义是在<设计模式>(Addison-Wesley)中

解读

1>在数学与逻辑学中,Singleton的定义是:"有且只有一个元素的集合".

2>在程序中,无论以什么方式创建对象,总是放回第一次创建的对象

(二)何时使用单例模式

类只能有一个实例,并且必须从一个为人熟知的访问点对其进行访问,比如工厂方法

避免重复生成同一对象浪费内存空间

(三)实现单例模式的思想-拦截创建对象的方法,在调用创建对象的方法时,总是返回第一次创建的对象

(四)在iOS中实现单例模式的方法

1>通过GCD中的once函数来进行实现

 #import <Foundation/Foundation.h>

 @interface ZDZPerson : NSObject

 + (instancetype)sharedPerson;
@end

ZDZPerson.h

 #import "ZDZPerson.h"

 @interface ZDZPerson () <NSCopying>

 @end

 @implementation ZDZPerson

 //创建一个全局变量(目的是在整个生命周期都可以访问到)
static id _person; //调用alloc方法或其他生成对象的方法时会默认调用allocWithZone方法
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
static dispatch_once_t tokenOnce;
dispatch_once(&tokenOnce, ^{
_person = [super allocWithZone:zone];
});
return _person;
} //实现此方法避免因copy对象时 产生新的对象
- (id)copyWithZone:(NSZone *)zone {
return _person;
} //自定义sharedPerson方法 返回对象
+ (instancetype)sharedPerson {
static dispatch_once_t tokenOnce;
dispatch_once(&tokenOnce, ^{
_person = [[self alloc] init];
});
return _person;
} @end

ZDZPerson.m

2>通过为线程加锁的方式实现

 #import <Foundation/Foundation.h>

 @interface ZDZAnimal : NSObject
+ (instancetype)sharedAnimal;
@end

ZDZAnimal.h

 #import "ZDZAnimal.h"

 @implementation ZDZAnimal
static id _animal; //调用alloc方法或其他生成对象的方法时会默认调用allocWithZone方法
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
@synchronized(self) {
if (_animal == nil) {
_animal = [super allocWithZone:zone];
}
}
return _animal;
} //实现此方法避免因copy对象时 产生新的对象
- (id)copyWithZone:(NSZone *)zone {
return _animal;
} //自定义sharedPerson方法 返回对象
+ (instancetype)sharedAnimal {
@synchronized(self) {
_animal = [[self alloc] init];
}
return _animal;
}
@end

ZDZAnimal.m

(五)实现单例类代码的复用:通过#define来实现单例代码的复用

1>代码解读

#define kZDZSingletonH(name) + (instancetype)shared##name;  可以通过此方式动态设置函数名

扩展:

#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x

x##y表示什么?表示x连接y,举例说:
int n = Conn(123,456);   结果就是n=123456;
char* str = Conn("asdf", "adf")结果就是 str = "asdfadf";
怎么样,很神奇吧

再来看#@x,其实就是给x加上单引号,结果返回是一个const char。举例说:
char a = ToChar(1);结果就是a='1';
做个越界试验char a = ToChar(123);结果是a='3';
但是如果你的参数超过四个字符,编译器就给给你报错了!error C2015: too many characters in constant   :P

最后看看#x,估计你也明白了,他是给x加双引号
char* str = ToString(123132);就成了str="123132";

注:转载他人

1>工具类代码

 #define kZDZSingletonH(name) + (instancetype)shared##name;

 #define kZDZSingletonM(name)\
static id _instance;\
\
+ (instancetype)allocWithZone:(struct _NSZone *)zone {\
static dispatch_once_t tokenOnce;\
dispatch_once(&tokenOnce, ^{\
_instance = [super allocWithZone:zone];\
});\
return _instance;\
}\
\
- (id)copyWithZone:(NSZone *)zone {\
return _instance;\
}\
\
+ (instancetype)shared##name {\
static dispatch_once_t tokenOnce;\
dispatch_once(&tokenOnce, ^{\
_instance = [[self alloc] init];\
});\
return _instance;\
}

ZDZSingleton.h

2>使用方法

 #import <Foundation/Foundation.h>
#import "ZDZSingleton.h" @interface ZDZComputer : NSObject kZDZSingletonH(Computer) @end

ZDZComputer.h

 #import "ZDZComputer.h"

 @implementation ZDZComputer

 kZDZSingletonM(Computer)

 @end

ZDZComputer.m

iOS设计模式-单例模式的更多相关文章

  1. iOS设计模式——单例模式

    单例模式用于当一个类只能有一个实例的时候, 通常情况下这个“单例”代表的是某一个物理设备比如打印机,或是某种不可以有多个实例同时存在的虚拟资源或是系统属性比如一个程序的某个引擎或是数据.用单例模式加以 ...

  2. IOS设计模式之一(MVC模式,单例模式)

    iOS 设计模式-你可能已经听说过这个词,但是你真正理解它意味着什么吗?虽然大多数的开发者可能都会认为设计模式是非常重要的,然而关于设计模式这一主题的文章却不多,并且有时候我们开发者在写代码的时候也不 ...

  3. iOS设计模式(02):单例模式

    iOS设计模式(02):单例模式 singleton-design-pattern 什么是单例模式? 单例模式是一个类在系统中只有一个实例对象.通过全局的一个入口点对这个实例对象进行访问.在iOS开发 ...

  4. IOS设计模式浅析之单例模式(Singleton)

    说在前面 进入正式的设计模式交流之前,扯点闲话.我们在项目开发的过程中,经常会不经意的使用一些常见的设计模式,如单例模式.工厂方法模式.观察者模式等,以前做.NET开发的时候,认真拜读了一下程杰老师的 ...

  5. iOS书摘之Objective-C编程之道 iOS设计模式解析

    来自<Objective-C编程之道iOS设计模式解析>一书的摘要总结 一.Prototype 原型模式 定义:使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象.(<设 ...

  6. iOS 设计模式

    很赞的总结 iOS Design Patterns 中文版 IOS设计模式之一(MVC模式,单例模式) IOS设计模式之二(门面模式,装饰器模式) IOS设计模式之三(适配器模式,观察者模式) IOS ...

  7. iOS设计模式 - (1)概述

    近期可自由安排的时间比較多, iOS应用方面, 没什么好点子, 就先放下, 不写了.花点时间学学设计模式. 之后将会写一系列博文, 记录设计模式学习过程. 当然, 由于我自己是搞iOS的, 所以之后设 ...

  8. iOS 的单例模式 dispatch_once

    iOS 的单例模式 dispatch_once 有些变量仅仅须要初始化一次(如从文件里读取配置參数.读取设备型号等等),能够使用dispatch_once来进行读取优化.保证仅仅调用API一次,以后就 ...

  9. 【设计模式】Java设计模式 - 单例模式

    [设计模式]Java设计模式 - 单例模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 分享学习心得,欢迎指正,大家一起学习成长! 原创作品,更多关注我CSDN: ...

随机推荐

  1. overflow:hidden的另一层含义

    overflow:hidden这个CSS样式是大家常用到的CSS样式,但是大多数人对这个样式的理解仅仅局限于隐藏溢出,而对于清除浮动这个含义不是 很了解.一提到清除浮动,我们就会想到另外一个CSS样式 ...

  2. [IR] Tolerant Retrieval & Spelling Correction & Language Model

    Dictionary不一定是个list,它可以是多种形式. 放弃Hash的原因: 通常,tree是比较适合的结构. From: http://www.cnblogs.com/v-July-v/arch ...

  3. [Math] Hidden Markov Model

    链接:https://www.zhihu.com/question/20962240/answer/33438846   霍金曾经说过,你多写一个公式,就会少一半的读者. 还是用最经典的例子,掷骰子. ...

  4. MySQL忘记root密码的找回方法

    (1)登录到数据库所在服务器,手工kill掉MySQL进程: kill ' cat /mysql-data-directory/hostname.pid'     其中,/mysql-data-dir ...

  5. 高级四则运算器—结对项目反思(193 & 105)

    高级四则运算器—结对项目反思(193 & 105) 本周我和一位韩国同学(71061105)一起结对编程完成了我们的结对项目——高级的小学四则运算题目生成器. PSP表格   PSP2.1 P ...

  6. C#多态--虚方法实现多态

    1.虚方法提供一种默认实现,子类可以选择是否重写,如果不重写,那么就使用父类已经实现的方法.(重写可以改变方法的指针) 如果需要改变类型指针,那么需要做方法的重写: 1.如果子类方法是重写方法,那么系 ...

  7. 文本对象模型(Document Object Model)

    本文内容: 1. 概述 2. DOM中的节点类型 3. DOM节点的选取 4. 存取元素属性 5.DOM元素的增删 6.小结 ★ 概述 文本对象模型(DOM)是一个能够让程序和脚本动态访问和更新文档内 ...

  8. JS对象的创建与使用

    本文内容:     1.介绍对象的两种类型:     2.创建对象并添加成员:     3.访问对象属性:     4.利用for循环枚举对象的属性类型:     5.利用关键字delete删除对象成 ...

  9. 【AngularJS学习笔记】00 序

    AngularJS通过新的属性与表达式来扩展HTML,有一种很形象的叫法,定义它为声明式语言. 为克服HTML在构建应用上的不足而设计! 这是它的目标. 它的官网进不去,应该是被墙了,这是goegle ...

  10. MySQL备份与恢复

    1.通过mysqldump命令进行数据备份 mysql数据库的备份采用直接打包数据库文件夹(注:InnoDB引擎不支持直接拷贝数据文件备份数据库,由于使用InnoDB引擎的库或表是不能使用此种方式): ...