(一)什么是单例模式(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. Transact-SQL 示例 - 使用脚本备份数据库的示例

    在常规的数据库开发与维护的过程中,常常需要对数据库进行数据备份,最入门的办法就是使用SSMS图形化界面提供的数据库备份向导一步一步操作进行备份,这种方式虽然简单快捷但是日子久了就会觉得重复且繁琐.下面 ...

  2. gulp-uglify《JS压缩》----gulp系列(四)

    本节实现JS压缩,在实现压缩前,先配置JS任务,设置源目录和输出目录. 在系列(三)代码的基础上,再进行扩展. 1.找到gulp->config.js,对JS进行源目录(src->img) ...

  3. python反射机制深入分析

    对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面结合一个web路由的实例来阐述pyth ...

  4. C语言中的经典例题用javascript怎么解?(一)

    C语言中的经典例题用javascript怎么解?(一) 一.1+2+3+……+100=?        <script type="text/javascript">  ...

  5. 使用Spark分析拉勾网招聘信息(一):准备工作

    本系列专属github地址:https://github.com/ios122/spark_lagou 前言 我觉得如果动笔,就应该努力地把要说的东西表达清楚.今后一段时间,尝试下系列博客文章.简单说 ...

  6. 前端js的书写规范和高效维护的方案_自我总结使用的方案

    作为程序员,人生最值得幸福的事有几件: 解决困扰了很长时间的问题 升职加薪 找个漂亮又靠谱的对象 深得领导的喜欢 带领团队冲锋陷阵 ... 哈哈,这些都是梦想,暂时想想就好了.这肯定和我说的东西不符合 ...

  7. [水煮 ASP.NET Web API2 方法论](3-5)路由约束

    问题 怎么样限制路由中参数的值. 解决方案 ASP.NET WEB API 允许我们通过 IHttpRouteConstraint 接口设置路由约束.集中式路由和直接式路由都可以使用 IHttpRou ...

  8. 用Perl编写Apache模块续 - SVNAuth

    目标:以整合各类项目管理系统中的用户体系及权限体系为目标,实现SVN的集成式动态鉴权 支持平台:usvn.禅道等 - 开发中,本文仅对前期的探索工作做点整理 开发环境: Windows.XAMPP 1 ...

  9. 多准则决策模型-TOPSIS方法

    多准则决策–Multiple Criteria Decision Making 多准则决策–Multiple Criteria Decision Making 多准则决策是指在具有相互冲突.不可共度的 ...

  10. Android的新虚拟机ART