百度定义:单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例.

维基百科:在软件工程中,单例是一种用于实现单例的数学概念,即将类的实例化限制成仅一个对象的设计模式。

简单理解:单例模式 是只有有一个实例对象的设计模式

这次 使用 单例 用 gcd 来创建

解释几个关键词

dispatch_once  :这个代码块 在整个应用的生命周期 只执行一次, 并且线程安全(如果被多个线程调用,该函数会同步等待直至代码块完成。gcd的底层做处理保证线程安全)

dispatch_once_t:(参数)这个断言 是声明这个代码块是否已经创建过了

优点:

(1)dispatch_once 线程安全

(2)代码简洁

(3)高效(比@synchronized 的两倍 "52个技巧上说的")

我的使用场景很简单, 我想创建一个单例字典 存储 刷新关键字 利用逻辑变化条件 指定刷新页面

我写的枚举恰好用到了 "52个技巧"里面学到的知识,因为  枚举 不一定得是 正整数 还可以是 四个字符的(通常4个字符代表一个字节 int 是4个字节)

这样 我可以定义不同页面的枚举 并且每个页面有自己独立的枚举参数

使用:

使用的时候 直接调用 类方法里面的实例方法 [AHFRefreshPageUtil shareInstance]setNeedRefreshStatus:YES type:AHFSearchRefreshTypeAll];

这样可以保证键值对 唯一

展示创建单例:

//
// AHFRefreshPageUtil.h
// dailylife
//
// Created by HF on 16/5/3.
//
// #import <Foundation/Foundation.h> @interface AHFRefreshPageUtil : NSObject + (AHFRefreshPageUtil *)sharedInstance; @end
//
// AHFRefreshPageUtil.m
// dailylife
//
// Created by HF on 16/5/3.
//
// #import "AHFRefreshPageUtil.h" @implementation AHFRefreshPageUtil
{
NSMutableDictionary *refreshDictionary;
}
static AHFRefreshPageUtil *refreshPageUtil; - (instancetype)init
{
self = [super init];
if(self){
refreshDictionary = [NSMutableDictionary dictionary];
}
return self;
} + (AHFRefreshPageUtil *)sharedInstance
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
refreshPageUtil = [[AHFRefreshPageUtil alloc] init];
});
return refreshPageUtil;

}
//待添加目标实例方法

其实 这里 这么写有潜在的bug  假如 使用

[[AHFRefreshPageUtil  alloc]init] 就是 普通的初始化了,不是单例用法了 所以  应该 把alloc 和 copy 都重写 防止意外出错,但是 我这里就默认 这一个用法,如果 出现 alloc 用法(并没有类似需求的情况下) 那一定是猪队友干的,review代码 好好说说他 就好了 哈哈 此处 不再多余添加代码(如果你想写的完美 可以尝试重写 alloc copy 方法 让他们返回时候 都是 同一个实例"sharedInstance" 就好了)

我的一个技术网友 总结的挺好的 简单一句话" 主要看如何实现线程唯一的创建 "

最新文章

  1. bzoj4443[SCOI2015]小凸玩矩阵
  2. Java 内部类的阐述
  3. [转] 64位windows下添加postgreSQL odbc数据源
  4. CMD命令大全
  5. java 程序中添加socks 5代理
  6. 基于python的flask的应用实例注意事项
  7. 什么是RST包,什么是三次握手,什么是四次握手 ---请进
  8. js学习笔记一类型、值和变量
  9. [Design Pattern] Command Pattern 简单案例
  10. 点击下拉,其余不动的jquery事件(转)
  11. EntityFramework Core 自动绑定模型映射
  12. C++ 中const作用
  13. Array.prototype.slice.call()方法详解
  14. MySQL从本地向数据库导入数据
  15. kruskal(拓展)
  16. (计算几何 线段判交) 51nod1264 线段相交
  17. This Product is covered by one or more of the following......的问题
  18. 用mint-ui picker组件 实现省市区三级联动
  19. java 数据类型和运算符
  20. 【xsy1230】 树(tree) 点分治+线段树

热门文章

  1. UITabelViewFootView(转)
  2. Linux下批量删除空文件
  3. java 服务接口API限流 Rate Limit
  4. Prime pair connection (Project Euler 134)
  5. [Python2.x] 利用commands模块执行Linux shell命令
  6. python tensorflow方法手记
  7. Android开发:《Gradle Recipes for Android》阅读笔记1.1
  8. Nginx nginx.conf配置文件详细说明
  9. 在前端眼中pc端和移动的开发区别
  10. kubectl工具的windows安装方法