单例模式

什么单例?

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

 

转载于:https://www.cnblogs.com/baymax/p/4329649.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值