iOS 单例模式 学习 "52个方法 第6章 45条 使用 dispath_once 来执行只需运行一次的线程安全代码"
百度定义:单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例.
维基百科:在软件工程中,单例是一种用于实现单例的数学概念,即将类的实例化限制成仅一个对象的设计模式。
简单理解:单例模式 是只有有一个实例对象的设计模式
这次 使用 单例 用 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" 就好了)
我的一个技术网友 总结的挺好的 简单一句话" 主要看如何实现线程唯一的创建 "
最新文章
- bzoj4443[SCOI2015]小凸玩矩阵
- Java 内部类的阐述
- [转] 64位windows下添加postgreSQL odbc数据源
- CMD命令大全
- java 程序中添加socks 5代理
- 基于python的flask的应用实例注意事项
- 什么是RST包,什么是三次握手,什么是四次握手 ---请进
- js学习笔记一类型、值和变量
- [Design Pattern] Command Pattern 简单案例
- 点击下拉,其余不动的jquery事件(转)
- EntityFramework Core 自动绑定模型映射
- C++ 中const作用
- Array.prototype.slice.call()方法详解
- MySQL从本地向数据库导入数据
- kruskal(拓展)
- (计算几何 线段判交) 51nod1264 线段相交
- This Product is covered by one or more of the following......的问题
- 用mint-ui picker组件 实现省市区三级联动
- java 数据类型和运算符
- 【xsy1230】 树(tree) 点分治+线段树
热门文章
- UITabelViewFootView(转)
- Linux下批量删除空文件
- java 服务接口API限流 Rate Limit
- Prime pair connection (Project Euler 134)
- [Python2.x] 利用commands模块执行Linux shell命令
- python tensorflow方法手记
- Android开发:《Gradle Recipes for Android》阅读笔记1.1
- Nginx nginx.conf配置文件详细说明
- 在前端眼中pc端和移动的开发区别
- kubectl工具的windows安装方法