iOS主要知识总结--单例模式

单例模式的实现

单例是一种很常见的模式,它的原理就是使程序运行过程中,某个类只有一个实例,无论以什么方式创建,都返回同一个实例化对象。它的具体实现代码如下所示:

@implementation WJTool

//提供一个static修饰的全局静态变量,这句代码保证了单例的生命周期是整个函数
static WJTool *_instance;

//alloc内部会调用这个方法
+(instancetype)allocWithZone:(struct _NSZone *)zone{
   //之前普遍的写法,但是并不能保证线程安全
    /*
    @synchronized (self) {
        if (_instance==nil) {
            _instance = [super allocWithZone:zone];
        }
    }   */

    //为了既能使创建实例的代码只执行一次,并且保证线程安全,这里使用GCD的一次性函数最好不过
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance=[super allocWithZone:zone];
    });
    return _instance;
}

//一般情况下,工具类都会提供一个类方法来供外界调用
+(instancetype)shareTool{
    return [[self alloc]init];
}


//严谨起见,重写copyWithZone和MutableCopyWithZone方法
-(id)copyWithZone:(NSZone *)zone{
    return _instance;
}

-(id)mutableCopyWithZone:(NSZone *)zone{
    return _instance;
}

单例的简洁实现:

在开发中,为了提高编码效率,并且这个单例是自己在已知的情况下调用,可以采用简单的方法实现:

+(instancetype)shareTool
{
    static WJTool *_instance;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        _instance = [[self alloc]init];
    });

    return _instance;
}
iOS主要知识总结--单例模式_第1张图片
xcode.png

你可能感兴趣的:(iOS主要知识总结--单例模式)