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];
这样可以保证键值对 唯一
展示创建单例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // // AHFRefreshPageUtil.h // dailylife // // Created by HF on 16/5/3. // // #import <Foundation/Foundation.h> @ interface AHFRefreshPageUtil : NSObject + (AHFRefreshPageUtil *)sharedInstance; @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | // // 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" 就好了)
我的一个技术网友 总结的挺好的 简单一句话" 主要看如何实现线程唯一的创建 "
posted on 2016-05-03 17:16 ACM_Someone like you 阅读(773) 评论(0) 编辑 收藏 举报
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)