Singleton类中的Init方法(Objective-C)



我有一个关于在Objective-C中实现单例类的安全方法的问题。我的背景主要是web开发(PHP),但我知道在Obj-C中情况完全不同。例如,我有一个自定义类MyClass,我想成为singleton:

static MyClass *sharedInstance = nil;
@interface MyClass:NSObject
    NSMutableArray *someArray;
@end
@implementation MyClass:NSObject
-(id)init
{
    if(sharedInstance) {
        self = sharedInstance;
    } else if((self=[super init])) {
        sharedInstance = self;
        someArray = [[NSMutableArray alloc]initWithCapacity:10];
    }
    return self;
}
+(MyClass *)sharedObject
{
    if(!sharedInstance) {
        sharedInstance = [[MyClass alloc]init];
    }
    return sharedInstance;
}
@end
  1. 这个实现可以吗
  2. 由于在Obj-C中,我不能使构造函数私有(据我所知,也许我错了),所以用这种方式创建init方法可以吗

正如gnasher729所说,为了线程安全,您需要使用dispatch_once_t

+(MyClass *)sharedObject
{
    static MyClass *sharedObject = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedObject = [[self alloc] init];
        sharedObject.someArray [[NSMutableArray alloc] initWithCapacity:10];
    });
    return sharedObject;
}

请参阅此链接使用GCD';s在目标C中的dispatch_once,用于创建单例的推荐方法。

使用gcd,代码变得线程安全。现在大多数人认为有人调用[[Singleton alloc]init]是一个你不会为其编写代码的bug,所以init方法应该只初始化对象。

最新更新