Objective-C单例模式实现
2015-06-08 10:15
375 查看
在OC中我们通常通过[b]@synchronized同步锁和GCD两种方式来实现单例,代码如下:[/b]
这个静态方法就是我们向整个系统提供的对该类单实例的唯一访问点。但是这样是无法保证该类是单实例的,因为还有其他实例化方法,如:[[xxx alloc]init],我们还需要做一些其他的工作,代码如下:
注:与同步锁的方式相比,通过GCD来实现单例,效率更高。
@synchronized同步锁
static Instance *obj = nil; + (id)sharedInstance { @synchronized(self) { if(!obj) obj = [[Instance alloc] init]; } return obj; }
GCD
static Instance *obj = nil; + (id)sharedInstance { static dispatch_once_t once; dispatch_once(&once, ^{ obj = [[Instance alloc] init]; }); return obj; }
这个静态方法就是我们向整个系统提供的对该类单实例的唯一访问点。但是这样是无法保证该类是单实例的,因为还有其他实例化方法,如:[[xxx alloc]init],我们还需要做一些其他的工作,代码如下:
重写allocWithZone方法
+ (instancetype)allocWithZone:(struct _NSZone *)zone { //确保对同一实例及其成员不重新分配内存 if (obj == nil) { @synchronized(self){ obj = [super allocWithZone:zone]; } } return obj; }
适当修改init方法
//保证成员变量只被初始化一次 if(!_xxx) { _xxx = [[类名 alloc]init]; }
注:与同步锁的方式相比,通过GCD来实现单例,效率更高。
相关文章推荐
- php设计模式之单例模式实例分析
- C#设计模式之单例模式实例讲解
- 深入理解JavaScript系列(25):设计模式之单例模式详解
- Java单例模式、饥饿模式代码实例
- Android源码学习之单例模式应用及优点介绍
- C++设计模式之单例模式
- Java线程安全中的单例模式
- PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
- php实现singleton()单例模式实例
- PHP中数据库单例模式的实现代码分享
- php利用单例模式实现日志处理类库
- 浅析php单例模式
- php单例模式实现方法分析
- js单例模式的两种方案
- php单例模式示例分享
- java单例模式使用详解
- android设计模式之单例模式详解
- C++ 中的单例模式(普通,2B,文艺)
- php单态设计模式(单例模式)实例
- PHP实现单例模式最安全的做法