Objective c 在+中创建单例实例;负载

Objective c 在+中创建单例实例;负载,objective-c,singleton,objective-c-runtime,Objective C,Singleton,Objective C Runtime,每个人都见过或使用过这样的代码来创建singleton实例: static MySingletonClass *instance; +(MySingletonClass*)sharedInstance { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [self new]; }); return instance; } 我想知道:为什

每个人都见过或使用过这样的代码来创建singleton实例:

static MySingletonClass *instance;

+(MySingletonClass*)sharedInstance
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [self new];
    });

    return instance;
}
我想知道:为什么不直接使用+load方法,对于静态加载的类只调用一次?这将允许我们忽略检查实例是否存在:

static MySingletonClass *instance;

+(void)load
{
    instance = [self new];
}

假设-init不依赖于要调用的其他类+加载方法(应该如此)。什么会出错?有哪些缺点或隐患?

可以添加
NSLog(@“实例指针:%p”,实例)
在您
[self new]
abd调用
+load
两次并查看差异后?不必这样说日志将显示两个不同的值,但这意味着什么?也不需要这样做,因为不会直接调用
+(void)load
方法,对于静态加载的类,类装入器只调用一次。不必要的资源
+load
在加载二进制文件时被调用,如果程序的其余部分从未使用过,为什么要创建类的实例?在.data节中分配dispace\u一次比在二进制加载点进行堆分配更便宜(它只是一个int32,在原子上被交换为便宜的自旋锁的2到3倍)。