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中的代码只会被执行一次。


总结——单例设计模式


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


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











你可能感兴趣的:(设计模式)