【iOS 单例设计模式】底层解析与运用
【iOS 单例设计模式】底层解析与运用
一、单例设计名词解释:
(官方解释)单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。
(形象比喻)程序 — 公司 单例实例 - 管理员 单例设计模式就好比一家公司在创建到垮台 只招一个管理员。并且至始至终不换。当然这个管理员有直属的职责方法 [UIApplication sharedApplication].keyWindow 这里的UIApplication 就是管理员 sharedApplication 就是唯一的管理员身份怎么 keyWindow就是该管理员的职责方法。
二、常见的单例设计模式
[UIApplication sharedApplication]
[UIScreen mainScreen]
[NSUserDefaults standardUserDefaults]
垃圾箱
任务管理器
三、单例设计的使用建议
1、节省内存开销。如果某个对象需要被多个其它对象使用,那可以考虑使用单例,因为这样该类只使用一份内存资源。
2、使用单例,可以确保其它类只获取类的一份数据( 变量值 )。
优点
1、提供了对唯一实例的受控访问。
2、由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
3、因为单例模式的类控制了实例化的过程,所以类可以更加灵活修改实例化过程。
缺点
1、由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
2、单例类的职责过重,在一定程度上违背了“单一职责原则”。
四、单例设计实践
1、线程不安全写法
#import "DanliManger.h" static DanliManger *danliManger = nil; //定义一个全局的对象
@implementation DanliManger + (DanliManger *)shareManger { //此实例方法线程不安全,在多个实例同时加载的情况下。实例会同时创建
if (!danliManger) {
danliManger = [[DanliManger alloc] init];
} return danliManger;
} @end
运行结果:
//执行方法
DanliManger *A = [DanliManger shareManger];
DanliManger *B = [DanliManger shareManger];
DanliManger *C = [[DanliManger alloc] init];
DanliManger *D = [[DanliManger alloc] init];
NSLog(@"\nA:%@\nB:%@\nC:%@\nD:%@",A,B,C,D); //下面是运行结果
A:<DanliManger: 0x17420ab90>
B:<DanliManger: 0x17420ab90>
C:<DanliManger: 0x17420aba0>
D:<DanliManger: 0x17420abb0>
2、线程安全写法(推荐)
#import "DanLiManager_2.h"
@implementation DanLiManager_2
+ (DanLiManager_2 *)shareManager {
static dispatch_once_t once;
static DanLiManager_2 *manager;
dispatch_once(&once, ^{ //线程只会执行一次,线程安全
manager = [[DanLiManager_2 myAlloc] init];
});
return manager;
}
+(instancetype)myAlloc{
return [super allocWithZone:nil];
}
+(instancetype)alloc{
NSAssert(, @"这是一个单例对象,请使用+(ZYHPayManager *)sharedMamager方法");
return nil;
}
+(instancetype)allocWithZone:(struct _NSZone *)zone{
return [self alloc];
}
+ (id)copy{
NSLog(@"这是一个单例对象,copy将不起任何作用");
return self;
}
+(instancetype)new{
return [self alloc];
}
@end
运行结果:
1 //执行方法
2 DanLiManager_2 *A21 = [DanLiManager_2 copy];
3 DanLiManager_2 *A211 = [DanLiManager_2 new];
4 DanLiManager_2 *A2 = [DanLiManager_2 shareManager];
5 DanLiManager_2 *B2 = [DanLiManager_2 shareManager];
6 DanLiManager_2 *C2 = [[DanLiManager_2 alloc] init];
7 DanLiManager_2 *D2 = [[DanLiManager_2 alloc] init];
8 NSLog(@"a12 %@ : a211%@",A21, A211);
9 NSLog(@"\nA2:%@\nB2:%@\nC2:%@\nD2:%@",A2,B2,C2,D2);
10
11 //运行结果
12 这是一个单例对象,copy将不起任何作用
13 a12 DanLiManager_2 : a211(null)
14 A2:<DanLiManager_2: 0x174015810>
15 B2:<DanLiManager_2: 0x174015810>
16 C2:(null)
17 D2:(null)
五、总结
从运行结果可以直观的看出。单例设计模式只有一个实例,线程安全。
【iOS 单例设计模式】底层解析与运用的更多相关文章
- iOS单例设计模式具体解说(单例设计模式不断完好的过程)
在iOS中有非常多的设计模式,有一本书<Elements of Reusable Object-Oriented Software>(中文名字为<设计模式>)讲述了23种软件设 ...
- ios 单例设计模式
单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类.单例可用性非常高,用于登录用户管理等可供全局调用. + (AccountMa ...
- iOS开发之单例设计模式(完整正确版本)
单例的意思从字面上就可以略知一二,所谓单例就是确保在程序运行过程中只创建一个对象实例.可以用于需要被多次广泛或者说多次使用的资源中,比如我们常见的网络请求类.工具类以及其它管理类等.比如我iOS开发中 ...
- IOS中的单例设计模式
单例设计模式是IOS开发中一种很重要很常用的一种设计模式.它的设计原理是无论请求多少次,始终返回一个实例,也就是一个类只有一个实例.下面是苹果官方文档中关于单例模式的图片: 如图所示,左边的图是默认的 ...
- iOS 中的单例设计模式
单例设计模式:在它的核心结构中只包含一个被称为单例类的特殊类.例如文件管理中的NSUserDefault,应用程序中的UIApplication,整个应用程序就这一个单例类,负责应用程序的一些操作,单 ...
- IOS设计模式第二篇之单例设计模式
现在我们的组件已经有组织了.你需要从其他的地方得到数据,你也可以创建一个API类管理数据这个下个设计模式单例里面介绍. 这个单例设计模式确保这个类仅仅拥有一个实例,并且为这个实例提供一个全局的访问点. ...
- Java设计模式—单例设计模式(Singleton Pattern)全然解析
转载请注明出处:http://blog.csdn.net/dmk877/article/details/50311791 相信大家都知道设计模式,听的最多的也应该是单例设计模式,这种模式也是在开发中用 ...
- GOF设计模式之1:单例设计模式
1.单例设计模式核心作用: 保证一个类只有一个实例,并且提供了访问该实例的全局访问点 2.常见应用场景: window的任务管理器 项目中读取配置文件一般也是一个单例模式 数据库连接池的设计也是采用单 ...
- Servlet以及单例设计模式
1.Servlet概述 a)Servlet,全城是Servlet Applet,服务器端小程序,是一个接口,定义了若干方法,要求所有的Servlet必须实现. b)Servlet用于接收客户端的请求, ...
随机推荐
- dos命令行 指令
盘符: 例如想进入D盘 d: ../ 上一层目录 md 文件夹名 新建文件夹cd 文件夹名 进入到该目录cd.. 返回上一层目录cd\ 返回根目录 cd \windows 进入到当前盘Windows目 ...
- Timequest收集命令
表 1. 收集命令 命令 说明 all_clocks 返回设计中所有时钟的收集. all_inputs 返回设计中输入端口的收集. all_outputs 返回设计中所有寄存器的收集. get_cel ...
- 我理解的Sitecore开发流程
Sitecore是一个强大的支持快速开发CMS建站的平台,进入sitecore后台可以看到 它主要有3个元素: 1.Templates模板 Data template:类似于面向对象编程中的类或结构体 ...
- Javascript模块化编程(三):require.js的用法
Javascript模块化编程(三):require.js的用法 原文地址:http://www.ruanyifeng.com/blog/2012/11/require_js.html 作者: 阮一峰 ...
- ORACLE LINUX 6.3 + ORACLE 11.2.0.3 RAC + VBOX安装文档
ORACLE LINUX 6.3 + ORACLE 11.2.0.3 RAC + VBOX安装文档 2015-10-21 12:51 525人阅读 评论(0) 收藏 举报 分类: Oracle RA ...
- 51. 顺时针打印矩阵[print matrix in clockwise direction]
[本文链接] http://www.cnblogs.com/hellogiser/p/print-matrix-in-clockwise-direction.html [题目] 输入一个矩阵,按照从外 ...
- 设计模式--原型模式Prototype(创建型)
一.原型模式 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.原型模式实现的关键就是实现Clone函数,还需要实现深拷贝. 二.UML类图 三.例子 //父类 class Resume ...
- 第二天--html+css
<!Doctype html><html> <head> <meta charset="utf-8"> ...
- SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例,合并列的例子
使用过SQL Server 2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQL Server 2005中,使用新引进的关键字PIVOT/UN ...
- SQL添加维护 计划失败
在sql要求数据库每天自动备份这个是大家都会遇到的问题,我遇到了这个问题如图: 是因为这个服务组件没有安装