代码改变世界

IOS--设计模式--单例模式

2014-08-28 14:56  doudo  阅读(149)  评论(0)    收藏  举报

创建单例有两种方法,推荐方法一.

方法一(推荐):

打开libraryAPI(我们要创建的单例类)头文件,写上以下代码:

@interface libraryAPI : NSObject

+(libraryAPI)shareInstance;

@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:用GCD来执行block初始化libraryAPI实例。这是单例设计模式的本质。这个初始化不在被调用这个类已经被初始化。并且是线程安全的。

 

 

方法二:

在objective-c中要实现一个单例类,至少需要做以下四个步骤:
  1、为单例对象实现一个静态实例,并初始化,然后设置成nil,
  2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例,
  3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例,
  4、适当实现allocWitheZone,copyWithZone,release和autorelease。
下面以SurveyRunTimeData为例子:
 
static SurveyRunTimeData *sharedObj = nil; //第一步:静态实例,并初始化。
@implementation SurveyRunTimeData
+ (SurveyRunTimeData*) sharedInstance  //第二步:实例构造检查静态实例是否为nil
{
    @synchronized (self)
    {
        if (sharedObj == nil)
        {
            [[self alloc] init];
        }
    }
    return sharedObj;
}

+ (id) allocWithZone:(NSZone *)zone //第三步:重写allocWithZone方法
{
    @synchronized (self) {
        if (sharedObj == nil) {
            sharedObj = [super allocWithZone:zone];
            return sharedObj;
        }
    }
    return nil;
}

- (id) copyWithZone:(NSZone *)zone //第四步
{
    return self;
}

- (id) retain
{
    return self;
}

- (unsigned) retainCount
{
    return UINT_MAX;
}

- (oneway void) release
{
    
}

- (id) autorelease
{
    return self;
}

- (id)init
{
    @synchronized(self) {
        [super init];//往往放一些要初始化的变量.
        return self;
    }
}

@end