iOS 设计模式——单例模式

iOS 创建单例的两个中模式


单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。


单例模式在iOS开发中非常创建,也非常重要。iOS中几个类就自带了单例模式,比如:NSApplication NSFontManager,   NSDocumentController,NSHelpManager, NSNull,NSProcessInfo, NSScriptExecutionContext,   NSUserDefaults。


第一种方法:synchronize关键字


1、重写allocWithZone方法,代码如下:

//创建单例对象

static TFDataCache *dCache = nil;

/**

 *  重写父类的方法

 */

+ (instancetype)allocWithZone:(struct _NSZone *)zone{

        //synchronized关键字,代表该方法加锁

    @synchronized(self){

        if (!dCache) {

            dCache = [super allocWithZone:zone];

        }

    }

    return dCache;

}

2、建立sharedXXX类方法,方便其他人访问。代码如下:

/**

 *  创建单例

 */

+(TFDataCache *)sharedDataCache{

    //synchronized关键字,代表该方法加锁

    @synchronized(self){ 

        if (!dCache) {

            dCache = [[[TFDataCache class]alloc]init];

        }

    }

    return dCache;

}

注:1、@synchronized,代表这个方法加锁, 相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程例如B正在用这个方法,有的话要等正在使用synchronized方法的线程B运行完这个方法后再运行此线程A,没有的话,直接运行。


第二种方法:dispatch_once(GCD)(iOS 4以后开始推出)


1、重写allocWithZone方法,代码如下:

//创建单例对象

static TFDataCache *dCache =nil;

+ (instancetype)allocWithZone:(struct_NSZone *)zone{

     static dispatch_once_t onceToken;

    //代码只执行一次

   dispatch_once(&onceToken, ^{

        

       dCache = [super allocWithZone:zone];

        

    });

   returndCache;

}

2、建立sharedXXX类方法,方便其他人访问。代码如下:

//创建单例对象

+(TFDataCache *)sharedDataCache{

    

    return [self allocWithZone:nil];

}

注:dispatch_once 是线程安全的,能够做到在多线程的环境下Block中的代码只会被执行一次。


总结——单例设计模式


优点:可以阻止其他对象实例化单例对象的副本,从而确保所有对象都访问唯一实例;


缺点:单例对象一旦建立,对象指针是保存在静态区的,单例对象在堆中分配的内存空间,会在应用程序终止后才会被释放;











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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值