Cocoa的单例(singleton)设计模式
来源:互联网 发布:淘宝手机详情页加链接 编辑:程序博客网 时间:2024/05/16 19:52
原帖地址:http://www.cocoachina.com/newbie/basic/2009/0611/254.html
1、普通方法
如果你准备写一个类,希望保证只有一个实例存在,同时可以得到这个特定实例提供服务的入口,那么可以使用单态设计模式。单态模式在Java、C++中很常用,在Cocoa里,也可以实现。
由于自己设计单态模式存在一定风险,主要是考虑到可能在多线程情况下会出现的问题,因此苹果官方建议使用以下方式来实现单态模式:
static MyGizmoClass *sharedGizmoManager = nil; + (MyGizmoClass*)sharedManager{ @synchronized(self) { if (sharedGizmoManager == nil) { [[self alloc] init]; // assignment not done here } } return sharedGizmoManager;} + (id)allocWithZone:(NSZone *)zone{ @synchronized(self) { if (sharedGizmoManager == nil) { sharedGizmoManager = [super allocWithZone:zone]; return sharedGizmoManager; // assignment and return on first allocation } } return nil; //on subsequent allocation attempts return nil} - (id)copyWithZone:(NSZone *)zone{ return self;} - (id)retain{ return self;} - (unsigned)retainCount{ return UINT_MAX; //denotes an object that cannot be released} - (void)release{ //do nothing} - (id)autorelease{ return self;}
2、使用GCD创建单例
创建一个新类,命名它为LibraryAPI,设置父类为NSObject.打开LibraryAPI.h,用如下代码替换它的内容@interfaceLibraryAPI : NSObject + (LibraryAPI*)sharedInstance; @end
现在打开LibraryAPI.m,在@implementation 那一行后面插入下面的方法:+ (LibraryAPI*)sharedInstance { // 1 static LibraryAPI *_sharedInstance = nil; // 2 static dispatch_once_t oncePredicate; // 3 dispatch_once(&oncePredicate, ^{ _sharedInstance = [[LibraryAPI alloc] init]; }); return _sharedInstance; }
在这个简短的方法中,有一些需要需要注意的点:1.声明一个静态变量去保存类的实例,确保它在类中的全局可用性。2.声明一个静态变量dispatch_once_t ,它确保初始化器代码只执行一次3.使用Grand Central Dispatch(GCD)执行初始化LibraryAPI变量的block.这 正是单例模式的关键:一旦类已经被初始化,初始化器永远不会再被调用。下一次你调用sharedInstance的时候,dispatch_once块中的代码将不会执行(因为它已经被执行了一次),你将得到原先已经初始化好的实例。
0 0
- Cocoa的单例(singleton)设计模式
- Cocoa的单态(singleton)设计模式
- Cocoa的单态(singleton)设计模式
- Cocoa的单态(singleton)设计模式
- Java的单例设计模式Singleton
- 单例设计模式(Singleton)
- 单例设计模式Singleton
- singleton(单例设计模式)
- 单例设计模式(Singleton)
- Singleton 单例设计模式
- 单例设计模式Singleton
- Singleton 单例设计模式
- Singleton单例设计模式
- 单例(Singleton)设计模式
- 设计模式-Singleton单例
- 单例(Singleton)设计模式
- 我的设计模式学习笔记------>单例模式(Singleton)
- 设计模式(2)-单例模式(Singleton)
- 投标方案编写
- MS SQL SERVER2005 DAC链接
- SQL Server中的Char 、varchar 、Nvarchar数据类型
- Android图片缩放总结及比较
- ASIHTTPRequest系列(一):同步和异步请求
- Cocoa的单例(singleton)设计模式
- 函数参数中带省略号的用法
- VMware 安装CentOS
- 净空法师:陈晓旭往生的教训(转载)
- 通用的将表单数据拷贝到javabean的方法
- 七 MyEclipse手动安装SVN插件
- linux下C++调用python的高级方法
- NSData的用法
- 自定义Adapter的心得