2015-02-07 110 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