2017-09-20 48 views
0

我想弄清楚單身人士的最佳實施方案 這是我得到的最新版本。Objective-C單例執行

這是.m文件執行,什麼毛病:

#import "Foo.h" 

static Foo *object = nil; 

@implementation Foo 

+ (Foo*)sharedObject { 
    return [[Foo alloc] init]; 
} 

- (id)init { 
    static dispatch_once_t once; 
    dispatch_once(&once, ^{ 
     object = [super init]; 
    }); 

    return object; 
} 

@end 

,並使用它,我可以這樣做:

[Foo sharedObject] 

[[Foo alloc] init] 

,都將返回相同的對象。

+0

你在做什麼是一個不好的做法,這是做單身人士的錯誤方法。 'alloc init'必須總是返回一個實例,而不是一個懶惰的分配單例。請參閱@isamankumara回答正確的編碼模式。 – Shebuka

+0

爲什麼你說這是必須的,我認爲你的(必須)我的朋友是一個單身人士的敬意。這就是我寫這個問題的確切原因。 singleton是這個類的唯一一個實例,否則它不是單例 –

回答

0

根據你的Foo類。當你調用兩種方法時沒有任何不同。 但我覺得更好,如果你可以改變你的Foo單身方法如下

+ (id) sharedObject { 
    static Foo *sharedobj = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedobj = [[self alloc] init]; 
    }); 
    return sharedobj; 
} 

- (id)init { 
    if (self = [super init]) { 
     someProperty = [[NSString alloc] initWithString:@"Default Property Value"]; 
    } 
    return self; 
} 

讓我們假設你想創建新實例。但是它不會使用alloc方法創建,因爲您重寫了init方法。

+0

我對你的解決方案的擔心是我仍然能夠創建一個實例,如果我調用了init方法,但是使用我的代碼無論你是否調用了-init或+ s​​haredObject它仍然會返回相同的對象。並根據我對單體設計模式的理解,無論如何你都不應該能夠創建這個類的另一個實例。 –