单例的理解和应用
来源:互联网 发布:源码交易系统 编辑:程序博客网 时间:2024/06/13 20:35
- 什么是单例呢?Wikipedia是如此定义的:
- 在软件工程中,单例是一种用于实现单例的数学概念,即将类的实例化限制成仅一个对象的设计模式。
- 或者我的理解是:
- 单例是一种类,该类只能实例化一个对象。
- 尽管这是单例的实际定义,但在Foundation框架中不一定是这样。比如NSFileManger和NSNotificationCenter,分别通过它们的类方法defaultManager和defaultCenter获取。尽管不是严格意义的单例,这些类方法返回一个可以在应用的所有代码中访问到的类的共享实例。在本文中我们也会采用该方法。
- 使用Objective-C实现单例模式的最佳方式向来有很多争论,开发者(包括Apple在内)似乎每几年就会改变他们的想法。当Apple引入了Grand Central Dispatch (GCD)(Mac OS 10.6和iOS4.0),他们也引入了一个很适合用于实现单例模式的函数。
- 该函数就是dispatch_once:
- void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);
- 该函数接收一个dispatch_once用于检查该代码块是否已经被调度的谓词(是一个长整型,实际上作为BOOL使用)。它还接收一个希望在应用的生命周期内仅被调度一次的代码块,对于本例就用于shared实例的实例化。
- dispatch_once不仅意味着代码仅会被运行一次,而且还是线程安全的,这就意味着你不需要使用诸如@synchronized之类的来防止使用多个线程或者队列时不同步的问题。
- Apple的GCD Documentation证实了这一点:
- 如果被多个线程调用,该函数会同步等等直至代码块完成。
- 实际要如何使用这些呢?
- 好吧,假设有一个AccountManager类,你想在整个应用中访问该类的共享实例。你可以按如下代码简单实现一个类方法:
- + (AccountManager *)sharedManager {
- static AccountManager *sharedAccountManagerInstance = nil;
- static dispatch_once_t predicate; dispatch_once(&predicate, ^{
- sharedAccountManagerInstance = [[self alloc] init];
- });
- return sharedAccountManagerInstance;
- }
- 这就意味着你任何时候访问共享实例,需要做的仅是:
- AccountManager *accountManager = [AccountManager sharedManager];
- 就这些,你现在在应用中就有一个共享的实例,该实例只会被创建一次。
- 该方法有很多优势:
- 1 线程安全
- 2 很好满足静态分析器要求
- 3 和自动引用计数(ARC)兼容
- 4 仅需要少量代码
- 该方法的劣势就是它仍然运行创建一个非共享的实例:
- AccountManager *accountManager = [[AccountManager alloc] init];
- 有些时候你希望有这种行为,但如果正在想要的是仅一个实例被实例化就需要注意这点。
0 0
- 单例的理解和应用
- 单例模式的理解与应用
- [置顶]单例模式的理解与应用
- 单例模式的写法和应用
- 单例的理解
- 单例设计模式和访问权限的理解
- 对单例的理解
- 单例模式的理解
- 单例模式的理解
- 对于单例的理解
- 单例模式的理解
- 单例模式的理解
- Java static的应用练习和单例模式
- VLAN的理解和应用
- 四元数的理解和应用
- 粒度的理解和应用:
- localStorage的理解和应用
- kvc的理解和应用
- Win7下用U盘安装Centos6.3双系统
- Linux_C第二次作业
- CentOS7安装tkinter
- Kmap
- iframe 获取值无法将console.log的对象转换为 string
- 单例的理解和应用
- linux上搭建hadoop环境(hadoop 2.7.1)总结
- Redis常用命令-Hash
- 机器视觉学习笔记(3)--如何去雾
- 巧用Live Template,不仅能提升AS开发效率,还能装逼
- 简单递归求阶乘
- 浮点数介绍及使用注意事项
- ubuntu eclipse:An error has occurred. See the log file
- Java学习----day2——(4)面对对象编程的概念理解