如何检查Singleton是否已初始化?

时间:2019-12-05 06:33:13

标签: ios objective-c oop design-patterns singleton

我在Objective-C中有一个Singleton课程。我想知道共享对象在访问sharedInstance之前是否已经初始化。我该怎么办?

+ (id)sharedInstance {
    static MyObject *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}
- (id)init {
    if (self = [super init]) {}
    return self;
}

1 个答案:

答案 0 :(得分:1)

我可以想到2种可能的方法:

第一种方法:将static MyObject *sharedInstance = nil;移至该方法之外。它看起来像:

@implementation MyObject

static MyObject *sharedInstance = nil;

+ (id)sharedInstance {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}

+ (BOOL)isSharedInstanceInitialized {
    return sharedInatance != nil; 
}

- (id)init {
    if (self = [super init]) {}
    return self;
}

@end

第二种方法:如上面的注释所述,使用其他BOOL静态值

@implementation MyObject

static BOOL isInitialized = NO;

+ (id)sharedInstance {
    static MyObject *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];
        isInitialized = YES;
    });
    return sharedInstance;
}

+ (BOOL)isSharedInstanceInitialized {
    return isInitialized;
}

- (id)init {
    if (self = [super init]) {}
    return self;
}

@end