码迷,mamicode.com
首页 > 其他好文 > 详细

单例模式

时间:2015-03-11 14:26:20      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:

什么单例?

1、其实就是C语言中的全局变量;2、在整个程序生命周期内,该对象只有一份存在内存中;3、可以在多个对象之间共享数据;

例如:桌面换主题,主题只有一份 or 手机屏幕大小,大小只有一份

 

iOS中好几个类都是采用了单例模式:

比如NSApplication, NSFontManager,   NSDocumentController,NSHelpManager, NSNull,NSProcessInfo, NSScriptExecutionContext,   NSUserDefaults.

 

 

写法:

#import "singleManager.h"

@implementation singleManager

static id sharedSingle=nil;//声明静态实例,并初始化

//第一种写法:项目中最常用的方法,不考虑多线程同时调用

+(id)sharedSingleManager{//实例构造静态变量,检查是否为nil

    if(sharedSingle == nil){

        sharedSingle = [[self alloc] init];

        //也可以用这种方法创建sharedSingle = [[[self class] alloc] init];

    }

    return sharedSingle;

}

//第二种写法:免锁写法Lock free,最不常用

+(id)sharedSingleManager{//实例构造静态变量,检查是否为nil

    static BOOL oneT = NO;

    if(oneT == NO){

        oneT = YES;

        sharedSingle = [[self alloc] init];

    }

    return sharedSingle;

}

//第三种写法:加锁写法

+(id)sharedSingleManager{

    @synchronized (self){//让这段代码处于atomic状态  //多个线程同时进入时,只允许一个线程执行

        if(sharedSingle == nil){

            sharedSingle = [[self alloc] init];

        }

    }

    return sharedSingle;

}

//第四种写法:多线程GCD写法

+(id)sharedSingleManager{

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken,^{ //dispatch _once保证了blocks只能执行一次

        if(sharedSingle == nil){

            sharedSingle = [[self alloc] init];

        }

    });

    return sharedSingle;

}

//完整写法,非ARC需要重写下面的方法

+ (id)allocWithZone:(NSZone *)zone{

    @synchronized (self) {

        if (sharedSingle == nil) {

            sharedSingle = [super allocWithZone:zone];

            return sharedSingle;

        }

    }

    return nil;

}

+(id)copyWithZone:(NSZone *)zone {

    return self;

}

//ARC不需要重写下面的方法

-(id)retain{

    return self;

}

-(unsigned)retainCoun{

    return UINT32_MAX;//最大值

}

-(oneway void) release{

    //单例不允许release

}

-(id)autorelease{

    return self;

}

- (id)init{

    @synchronized(self) {

        [super init];//往往放一些要初始化的变量.

        return self;

    }

}

@end

 

视频资源http://study.163.com/course/courseMain.htm?courseId=877038

 

单例模式

标签:

原文地址:http://www.cnblogs.com/baymax/p/4329649.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!