原文链接http://blog.sina.com.cn/s/blog_6badd5400100vx50.html
如果你准备写一个类,希望保证只有一个实例存在,同时可以得到这个特定实例提供服务的入口,那么可以使用单态设计模式。
单态模式在Java、C++中很常用,在Cocoa里,也可以实现。
但是,
Objective-C的单例模式绝对和你所想象不一样,他的写法和你所见过的所有语言的写法都不一样。
官方建议
由于自己设计单态模式存在一定风险,主要是考虑到可能在多线程情况下会出现的问题,因此苹果官方建议使用以下方式来实现单态模式:
- static MyGizmoClass *sharedGizmoManager = nil;
- + (MyGizmoClass*)sharedManager
- {
- @synchronized(self){
- if(sharedGizmoManager == nil) {
- [[selfalloc] init]; // assignment not done here
- }
- }
- returnsharedGizmoManager;
- }
- + (id)allocWithZone:(NSZone *)zone
- {
- @synchronized(self){
- if(sharedGizmoManager == nil) {
- sharedGizmoManager = [superallocWithZone:zone];
- returnsharedGizmoManager; //assignment and return on first allocation
- }
- }
- return nil; //on subsequentallocation attempts return nil
- }
- - (id)copyWithZone:(NSZone *)zone
- {
- return self;
- }
- - (id)retain
- {
- return self;
- }
- - (unsigned)retainCount
- {
- returnUINT_MAX; //denotes an objectthat cannot be released
- }
- - (void)release
- {
- //do nothing
- }
- - (id)autorelease
- {
- return self;
- }
复制代码
程序员都是偷懒的,现在流行使用一个宏定义来搞定这许多的事,而且考虑的更加周全。
单例包含以下接口
- + (MyClass*) sharedInstance;
- + (void) purgeSharedInstance;
复制代码
调用sharedInstance会创建并返回单例
调用purgeSharedInstance会销毁单例
手动调用alloc也可以保证是单例,你可以这样调用
- [[MyClass alloc] initWithParam:firstParamsecondParam:secondParam];
复制代码
只是要保证在sharedInstance之前调用,因为只有一次创建机会。
下面是使用宏的写法“
MyClass.h:
========================================
- #import"SynthesizeSingleton.h"
- @interface MyClass:SomeSuperclass
- {
- ...
- }
- SYNTHESIZE_SINGLETON_FOR_CLASS_HEADER(MyClass);
- @end
复制代码
========================================
MyClass.m: ========================================
- #import "MyClass.h"
- @implementationMyClass
- SYNTHESIZE_SINGLETON_FOR_CLASS(MyClass);
- ...
- @end
复制代码
========================================、 |