繁体   English   中英

单例类中的Init方法(Objective-C)

[英]Init Method in Singleton Class (Objective-C)

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

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;
}

请参阅此链接使用目标C中的GCD dispatch_once创建单例,以获得创建单例的建议方法。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM