什么单例?

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

 

posted on 2015-03-11 13:28  轻度强迫症  阅读(127)  评论(0)    收藏  举报