标签:
什么单例?
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