其实iOS开发中的单例模式无非就是一个类创建的对象在程序中只有一个对象!
iOS中的单例模式有分为赖汉式和饿汉式单例两种但是我们在实际开发的过程中只要掌握一种赖汉式单例就行!赖汉式单例有两种实现方式一种是普通的方式(加锁)一种是GCD
首先我们先来看一下普通的方式(加锁实现)(大家需要注意这是在ARC下)
首先要想让一个类成为单例对象首先需要定义一个全局变量和三个方法:
// 用来保存唯一的单例对象
static id _instance;
+ (instancetype)allocWithZone:(struct _NSZone *)zone;
+ (instancetype)share+类名;
- (id)copyWithZone:(NSZone*)zone;
接下来我们就分别去实现这三个方法:
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
if (_instance == nil) { // 防止频繁加锁
@synchronized (self) {
if (_instance == nil) { // 防止创建多次
_instance = [super allocWithZone:zone];
}
}
}
return _instance;
}
+ (instancetype)share+类名
{
if (_instance == nil) { // 防止频繁加锁
@synchronized (self) {
if (_instance == nil) { // 防止创建多次
_instance = [[self alloc] init];
}
}
}
return _instance;
}
- (id)copyWithZone:(NSZone*)zone
{
return _instance;
}
最后就是我们的测试过程:
我分别用不同方式创建了四个对象,但是这个四个对象的内存地址打印如下图:
从内存地址的打印可见这四个对象是同一个对象!
接下来我就GCD实现单例模式做一下简单的介绍:
使用单例的步骤和上面的普通方式实现单例步骤一样只不过那三个方法的实现不一样而已啊!
打印结果也一样就不看了!小编有一个问题如果在非ARC模式下即便你写了这些你那个对象也不是单例因为在非ARC下可以释放对象;如果要实现单例必须实现另外的三个方法release()、retain()、retainCount()这三个方法;还有一个问题小编要在这里向广大读者提醒一下如果你的项目里面有三个类都是单例你是不是要讲我上面的代码写三遍呢?如果不是请留下你们宝贵的意见,在留下你们宝贵的意见的同时我给大家一个意见就是用超类但是你使用之后会发现那样不行?小编这里有一种方法但是我希望读者朋友留下自己的意见!