2013-09-23 21 views
0

我問這對Objective-C的,因爲我用它在那裏,但它可能適用於所有其他語言:一個Singleton作爲另一個類的屬性VS調用它的每一個方法

-is它壞有一個單一的Obj-C屬性的參考?

- 在每種方法中調用共享實例會更好嗎?

更精確:我有一個單獨的類,我可以使用[MySingleton sharedInstance];

我需要另一個類,單像50倍的值MySecondClass所以我創建了一個對象 - 屬性調用

@property (nonatomic, strong) MySingleton *mySingletonProperty; 

懶洋洋地在MySecondClass致電

if(!self.mySingletonProperty) 
{ 
    self.mySingletonProperty = [MySingleton sharedInstance]; 
} 

一次初始化屬性我的一個朋友告訴我,這將是一個壞主意,最好不要使用單例來實例化一個屬性。正確的方法是在MySecondClass的每種方法中調用[MySingleton sharedInstance];並將其分配給局部變量。

這是正確的嗎?爲什麼?線程安全不是問題。

(如果它是使用一般這裏一個單一個壞主意,請不要討論 - 感謝:-)

+1

單身人士是一個壞主意(但有時是一個必要的邪惡)開始。如果你可以用一些中心對象的屬性替換它,這通常是一個更好的主意。至於使它成爲一堆對象(都指向同一個單例實例)的屬性,這樣做並沒有太多好處,但是,如果它簡化了實際的編碼,我看不到它會帶來任何危害可能會造成混亂。如果你這樣做,請評論屬性。 –

回答

3

的說法我平時看到的反對一邊喊[SingletonClass sharedSingleton]是消息傳遞(函數調用)的開銷。在這種情況下,在屬性中存儲單例的引用具有相同的問題 - 始終調用self.singleton的函數調用次數與調用[SingletonClass sharedSingleton]的次數相同。

雖然這不是一個很好的論點,因爲這種開銷對性能的影響可以忽略不計。

相反,我會關心使用屬性的語義含義。雖然通常假設單例模式在應用程序的整個生命週期中只有一個單例類的實例,但「標準」單例接口沒有任何保證。如果你不擁有singleton類,你可能會違反它的設計假設,在strong屬性的某個其他對象的生命週期中保留它。如果你擁有這個類,那麼保留一個強有力的參考就會增加額外的設計約束,以後可能會(但不太可能)給你帶來問題。

總之,我會給出以下建議。如果您的代碼如下所示:

- someMethod { 
    [[SingletonClass sharedSingleton] doSomething]; 
} 
- someOtherMethod { 
    [[SingletonClass sharedSingleton] doSomethingElse]; 
} 

沒有問題。 (如果你真的想爲自己節省一些打字時間,那麼[SingletonClass sharedSingleton]的本地預處理宏也可以。)

如果你有這樣的代碼:

- someMethod { 
    SingletonClass *singleton = [SingletonClass sharedSingleton]; 
    [singleton doSomething]; 
    [singleton doSomethingElse]; 
    [singleton doSomeOtherThing]; 
    [singleton doYetAnotherThing]; 
} 

- someMethod { 
    [[SingletonClass sharedSingleton] doSomething]; 
    [[SingletonClass sharedSingleton] doSomethingElse]; 
    [[SingletonClass sharedSingleton] doSomeOtherThing]; 
    [[SingletonClass sharedSingleton] doYetAnotherThing]; 
} 

然後你就可以在一個局部變量積攢了一點沒有語義變化打字(和瑣碎的性能成本)的救自己

+0

2017年3月,這個答案教會了我很多 – Balanced

-1

如果你仍然需要一個單身人士,保持對它的引用沒有任何錯誤。但爲什麼你把這個參考作爲一個財產?我的建議是創建一個內部變量:

@interface MySecondClass : NSObject { 
    // ... 
    MySingleton *mySingletonInstanse; 
} 
// ... 
@end 
相關問題