【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用于接收客户端的请求, ...
随机推荐
- ASP.NET MVC和EF集成AngularJS开发
参考资料: 如何在ASP.NET MVC和EF中使用AngularJS AngularJS+ASP.NET MVC+SignalR实现消息推送 [AngularJs + ASP.NET MVC]使用A ...
- Java 时间的表示
//不建议的方式 out.println("<p>结束Servlet的时间:" + new Date().toLocaleString() + "</p ...
- CSS布局奇淫技巧之--各种居中
居中是我们使用css来布局时常遇到的情况.使用css来进行居中时,有时一个属性就能搞定,有时则需要一定的技巧才能兼容到所有浏览器,本文就居中的一些常用方法做个简单的介绍. 注:本文所讲方法除了特别说明 ...
- 当前Windows群集心跳阀值设置
一.内容描述: WINDOWS群集之间通过心跳检测(HeartBeat)各个节点是否正常在线,微软称此检测为lookalive,检测通过UDP数据包中封装的RPC信息进行传送.默认情况下为每秒检测一次 ...
- [Data Structure] LCSs——最长公共子序列和最长公共子串
1. 什么是 LCSs? 什么是 LCSs? 好多博友看到这几个字母可能比较困惑,因为这是我自己对两个常见问题的统称,它们分别为最长公共子序列问题(Longest-Common-Subsequence ...
- Linux系统硬链接和软链接介绍
1.链接的概念 在Linux系统中链接分为硬链接和软连接两种,一种为硬链接,另一种为软连接或符号链接(symbolic Link).ln命令就是创建链接文件的,在默认不带参数的情况下,执行ln命令创建 ...
- iOS json 解析遇到error: Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed.
Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 38 ...
- Fiddler将笔记本设置代理,抓取手机网络请求包
第一步:下载fiddler,下载地址:http://www.telerik.com/download/fiddler 第二步:安装fiddler,略过... 第三步:启动fiddler,启动后界面如下 ...
- Django Restful Framework (一): Serializer
Serializer 允许复杂数据(比如 querysets 和 model 实例)转换成python数据类型,然后可以更容易的转换成 json 或 xml 等.同时,Serializer也提供了反序 ...
- python 模块包裹
arlenmbx@arlenmbx-ThinkPad-X130e:~$ su root 密码: root@arlenmbx-ThinkPad-X130e:/home/arlenmbx# python ...