【问题标题】:How to check if a Singleton is already initialized?如何检查单例是否已经初始化?
【发布时间】:2019-12-05 06:33:13
【问题描述】:

我在Objective-C 有一个单例类。在访问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;
}

【问题讨论】:

  • 共享对象在sharedInstance方法中被初始化。所以在你调用这个方法之前,答案是否定的。如果你想有一个方法来检查,创建另一个类方法来检查sharedInstance。
  • 一种方法是添加一个静态布尔值,最初为NO。在sharedInstance 中将其设置为YES。您无法检查 sharedInstance 中的 nil,因为对 sharedInstance 的任何引用都会导致它被初始化。
  • 您可以检查onceToken 的值,但也可以使用类布尔值。

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


【解决方案1】:

我能想到两种可能的方法:

第一种方法:将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

第二种方法:如上面的 cmets 建议使用额外的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    相关资源
    最近更新 更多