iOS设计模式-单例模式
(一)什么是单例模式(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) #xx##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设计模式-单例模式的更多相关文章
- iOS设计模式——单例模式
单例模式用于当一个类只能有一个实例的时候, 通常情况下这个“单例”代表的是某一个物理设备比如打印机,或是某种不可以有多个实例同时存在的虚拟资源或是系统属性比如一个程序的某个引擎或是数据.用单例模式加以 ...
- IOS设计模式之一(MVC模式,单例模式)
iOS 设计模式-你可能已经听说过这个词,但是你真正理解它意味着什么吗?虽然大多数的开发者可能都会认为设计模式是非常重要的,然而关于设计模式这一主题的文章却不多,并且有时候我们开发者在写代码的时候也不 ...
- iOS设计模式(02):单例模式
iOS设计模式(02):单例模式 singleton-design-pattern 什么是单例模式? 单例模式是一个类在系统中只有一个实例对象.通过全局的一个入口点对这个实例对象进行访问.在iOS开发 ...
- IOS设计模式浅析之单例模式(Singleton)
说在前面 进入正式的设计模式交流之前,扯点闲话.我们在项目开发的过程中,经常会不经意的使用一些常见的设计模式,如单例模式.工厂方法模式.观察者模式等,以前做.NET开发的时候,认真拜读了一下程杰老师的 ...
- iOS书摘之Objective-C编程之道 iOS设计模式解析
来自<Objective-C编程之道iOS设计模式解析>一书的摘要总结 一.Prototype 原型模式 定义:使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象.(<设 ...
- iOS 设计模式
很赞的总结 iOS Design Patterns 中文版 IOS设计模式之一(MVC模式,单例模式) IOS设计模式之二(门面模式,装饰器模式) IOS设计模式之三(适配器模式,观察者模式) IOS ...
- iOS设计模式 - (1)概述
近期可自由安排的时间比較多, iOS应用方面, 没什么好点子, 就先放下, 不写了.花点时间学学设计模式. 之后将会写一系列博文, 记录设计模式学习过程. 当然, 由于我自己是搞iOS的, 所以之后设 ...
- iOS 的单例模式 dispatch_once
iOS 的单例模式 dispatch_once 有些变量仅仅须要初始化一次(如从文件里读取配置參数.读取设备型号等等),能够使用dispatch_once来进行读取优化.保证仅仅调用API一次,以后就 ...
- 【设计模式】Java设计模式 - 单例模式
[设计模式]Java设计模式 - 单例模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 分享学习心得,欢迎指正,大家一起学习成长! 原创作品,更多关注我CSDN: ...
随机推荐
- ArcGIS平台中PostgreSQL数据连接配置总结
通常用户在使用要素服务时,要求数据必须是存放在空间数据库中的.同时,需要将数据库注册到ArcGIS for Server,这样在发布服务时就不需要进行数据拷贝,从而可以节省磁盘空间及服务发布时间.以下 ...
- 移动端页面使用单位的问题:关于px、百分比、em、rem开发中逐渐转换的问题记录
开始写前端页面也有了快两年时间,从一开始的懵逼到现在的淡定,但是不能改变我还是一只小菜鸟的事实,平时遇到的一些问题都会记录在文件夹里,现在都整理一下大家一起分享自己平时也翻翻看看~ 不知道大家平时写的 ...
- Java中基本数据类型的存储方式和相关内存的处理方式(java程序员必读经典)
1.java是如何管理内存的 java的内存管理就是对象的分配和释放问题.(其中包括两部分) 分配:内存的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对 ...
- stl的优先级队列
#include <iostream> #include <vector> #include <queue> using namespace std; class ...
- statpot:使用mongo+bootstrap+highcharts做统计报表
最近做了一个统计项目,这个统计项目大致的需求是统计接口的访问速度.客户端会调用一个接口来记录接口的访问情况,我的需求就需要分析这些数据,然后做出个统计报表. 需求实现 最初的时候想着每天把这些接口访问 ...
- Velocity魔法堂系列三:模板与宿主环境通信
一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...
- SQL Server分布式数据库技术(LinkedServer,CT,SSB)
SQL Server自定义业务功能的数据同步 在不同业务需求的驱动下,数据库的模块化拆分将会面临一些比较特殊的业务逻辑处理需求.例如,在数据库层面的数据同步需求.同步过程中,可能会有一些比较复杂的业务 ...
- P6 EPPM R16.1安装与配置指南(三)
P6 EPPM R16.1安装与配置指南(三) 解压:V137390-01.zip 修改 D:\P6_R161\p6suite\database\dbsetup.bat 的行 SET JAR_FI ...
- OracleHelper(对增删改查分页查询操作进行了面向对象的封装,对批量增删改操作的事务封装)
公司的一个新项目使用ASP.NET MVC开发,经理让我写个OracleHelper,我从网上找了一个比较全的OracleHelper类,缺点是查询的时候返回DataSet,数据增删改要写很多代码(当 ...
- .net中清理内存,清理占用内存方式方法
#region 内存回收 [DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize") ...