首页 > 代码库 > IOS单例模式

IOS单例模式

单例模式是一种常见的软件设计模式。

通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。

如果希望系统中某个类的对象只能存在一个,单例模式是最好的解决反感。

IOS中最常见的单例就是UIApplication

单例的实现步骤:

1.重写allocWithZone方法

  allocWithZone方法是对象分配内存空间时,最终会调用的方法,重写该方法,保证只会分配个内存空间。

2.建立shaerdXXX类方法,便于其他类调用

+ (id)allocWithZone:(struct _NSZone *)zone
{
    static DemoObj *instance;
    
    // dispatch_once是线程安全的,onceToken默认为0
    static dispatch_once_t onceToken;
    // dispatch_once宏可以保证块代码中的指令只被执行一次
    dispatch_once(&onceToken, ^{
        // 在多线程环境下,永远只会被执行一次,instance只会被实例化一次
        instance = [super allocWithZone:zone];
    });
    
    return instance;
}

+ (instancetype)sharedDemoObj
{
    return [[self alloc] init];
}

还有一种常见的单例创建方式:

static DemoObj *instance;
+ (instancetype)sharedDemoObj
{
    // 如果有两个线程同时实例化,很有可能创建出两个实例来
    if (!instance) {
        // thread 1 0x0000A
        // thread 2 0x0000B
        instance = [[self alloc] init];
    }
    // 第一个线程返回的指针已经被修改!
}

但是[[DemoObj alloc] init] 和[DemoObj sharedDemoObj]实例化的对象的内存地址是不一样的,还有就是线程不安全。