设计模式-SingleTon

一、单例 singleTon

       单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。在项目中适于全局共享某个资源,保证其唯一性。如用户登录信息。

单例模式一般使用类方法创建。

特点:

1、全局都可以访问到   

2、操作单例对象的变量不会被释放

3、每次获取的对象都是同一个对象,只创建一次。通过单例方法创建的对象是同一个对象。

@interface Single_Ton : NSObject

//创建单例对象的方法,一般作为类方法
//命名规则 shared + 类名   或  standard + 类名

+ (Single_Ton *)sharedSingleTon;

@end

       每次通过该方法获取对象时,需要判断是否开辟过空间,如果已经开辟过则直接返回已有对象,否则开辟空间,创建对象

        如果出现同时抢夺一个资源,这里是多个线程,同时执行该方法。去创建对象,如果不做线程安全处理,会造成在开辟空间的同时,又有一个线程去开辟空间,这就不是单例了,因此我们需要添加线程处理。

        同步锁,在同步锁内的代码段受线程保护,一次只能有一个线程执行。在多线程情况下,后面的线程需等待

    

     

@implementation Single_Ton

static Single_Ton *singleTon = nil;
+ (Single_Ton *)sharedSingleTon {
    //添加同步锁
    @synchronized(self) {
        if (nil == singleTon) {
            //没有创建过,创建对象
            singleTon = [[Single_Ton alloc] init];
            
            //完整的单例,避免死循环
            //singleTon = [[super allocWithZone:nil] init];
        }
        return singleTon;
 
    }
}

          完整的单例 有时不仅通过特定方法取到的是同一个对象,进行 alloc copy mutableCopy 获取到的也是同一个对象。就需要我们重写这些方法,做一些内部实现

+ (instancetype)alloc {
    return [Single_Ton sharedSingleTon];
}

+ (instancetype)allocWithZone:(struct _NSZone *)zone {
    return [Single_Ton sharedSingleTon];
}

- (id) copy {
    return [Single_Ton sharedSingleTon];
}
- (id)mutableCopy {
    return [Single_Ton sharedSingleTon];
}

- (oneway void)release {
    //oneway void 返回值为空,不做任何操作
}

- (NSUInteger)retainCount {
    return NSUIntegerMax;//返回整形最大值
}

@end


使用CGD线程实现单例创建

static Single_Ton *singleTon = nil;
+ (Single_Ton *)sharedSingleTon {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        singleTon = [[Single_Ton alloc] init];
    });
    return singleTon;
}


转载于:https://my.oschina.net/u/2507274/blog/608080

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值