2015-02-07 121 views
1

我有一个关于在Objective-C中实现singleton类的安全方法的问题。 我的背景主要是在网络开发(PHP)中,但我知道在Obj-C中有很大的不同。比如我有一个我想成为单身这个自定义MyClass类:Singleton类中的Init方法(Objective-C)

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方法吗?

回答

1

看到这个链接Create singleton using GCD's dispatch_once in Objective C为建议的方法来创建一个单身人士。

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

+0

好的,非常感谢您的回复。的确,我正在考虑如何“禁用”alloc/init。 – Bogdan 2015-02-07 01:42:32

2

由于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; 
} 
+0

如果我想在这个类的其他方法中使用'someArray',我将如何使用它? – NSPratik 2015-07-09 08:58:08

+0

只需将以下代码行添加到您的单例类中。 - (id)copyWithZone:(NSZone *)zone { retun [self sharedObject]; } – 2016-04-25 12:29:38