如果你准备写一个类,希望保证只有一个实例存在,同时可以得到这个特定实例提供服务的入口,那么可以使用单态设计模式。

单态模式在Java、C++中很常用,在Cocoa里,也可以实现。

但是,

Objective-C的单例模式绝对和你所想象不一样,他的写法和你所见过的所有语言的写法都不一样。

 

官方建议

 

由于自己设计单态模式存在一定风险,主要是考虑到可能在多线程情况下会出现的问题,因此苹果官方建议使用以下方式来实现单态模式:

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;

}

 

开源模板(见附件​​下载​​)

程序员都是偷懒的,现在流行使用一个宏定义来搞定这许多的事,而且考虑的更加周全。

单例包含以下接口

+ (MyClass*) sharedInstance;

+ (void) purgeSharedInstance;

 

调用sharedInstance会创建并返回单例

调用purgeSharedInstance会销毁单例

手动调用alloc也可以保证是单例,你可以这样调用

[[MyClass alloc] initWithParam:firstParam secondParam:secondParam];

只是要保证在sharedInstance之前调用,因为只有一次创建机会。

下面是使用宏的写法“

MyClass.h:

========================================

    #import "SynthesizeSingleton.h"

    @interface MyClass: SomeSuperclass

    {

        ...

    }

    SYNTHESIZE_SINGLETON_FOR_CLASS_HEADER(MyClass);

    @end

========================================

    MyClass.m:

========================================

    #import "MyClass.h"

    @implementation MyClass

    SYNTHESIZE_SINGLETON_FOR_CLASS(MyClass);

    ...

    @end