2012-12-09 49 views
0

我正在爲現有的單例類創建包裝類。因爲我將訪問的單身好幾次,我想將其存儲在我的包裝類伊娃......我應該將一個單身人士作爲一個伊娃嗎?

@interface WrapperClass() 

@property (nonatomic, strong) SingletonClass singletonObj; 

@end 

......這樣我就不必不斷譜寫[[SingletonClass sharedInstance] methodName]。相反,我可以寫[singletonObj methodName]。它只是讓我感覺更清潔。

我是iOS開發新手,所以我想知道這種方法是否存在根本性錯誤。

此外,與ARC,我應該存儲單身人士與強大的參考?

+1

爲什麼要將它作爲任何對象的屬性或iVar?關鍵是你可以從任何地方訪問它們! – CodaFi

+0

由於我上面提到的原因,所以我不必每次都輸入[SingletonClass sharedInstance]。 – BeachRunnerFred

+1

但它沒有任何意義。事實上,你保留了一些無法發佈的東西,甚至根本不存儲它,這簡直太可笑了。如果你真的厭倦了打字,只需將'[SingletonClass sharedInstance]'映射到一些縮短的宏。或者,如果您實際上訪問的是單身人士,請考慮將其分解爲更小,更易於管理的對象。另外,上面的代碼將它存儲爲***屬性***而不是iVar。 – CodaFi

回答

2

除非你做一些瘋狂的可能性是額外的保留/釋放應該不會造成問題。

因此有一個與它存儲在伊娃沒有真正的問題...

更好的理由這樣做不會保存您的打字聲,而是以提高類的可測試性/可重用性。通過使它成爲一個伊娃,它允許你注入一個不同的類來改變行爲。

我會考慮的訪問時默認給我單身,但還是讓我來注入不同的類,如果我選擇這樣的

- (SingletonClass *)singletonObj; 
{ 
    return _singletonObj = _singletonObj ?: [SingletonClass sharedInstance]; 
} 

更新:

這也是值得我們思考的「爲什麼你會使用這個與使用伊娃不同的單身?」。如果你在整個班級中使用它,就像是一個伊娃,那麼你爲什麼要以完全不同的方式訪問它?

例如,當我使用managedObjectContext時,我的整個應用程序中只有一個。很多人使用應用程序委託作爲單例,並以此方式訪問它,但我更願意將它作爲ivar傳遞。從概念上來說,managedObjectContext只是另一個對象,我像其他任何伊娃一樣使用,那麼爲什麼我必須在思維上切換如何訪問它?

這是不好的

[(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 

self.managedObjectContext; 

現在,這給了我兩個優點。

  1. 如果我的類與調用[(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];散落那麼就很難撕了這個項目,並將其放置在另一個沒有危險的搜索和替換。如果我在一個地方訪問「訪問者」,那麼我只有一個地方可以更改代碼。

  2. 在我的生產應用程序中,我可能希望我的數據是持久性的,所以我會給該對象訪問持有存儲的managedObjectContext,而在我的測試中,我不希望狀態在測試之間持續存在,所以我會改爲給對象一個非持久性商店。

+0

謝謝,Paul.s,我想我會遵循。你有機會能給我一個例子嗎? – BeachRunnerFred

+0

以示例 –

+0

@ Paul.s更新,您正在編寫屬性和訪問器,而不是iVars ...我仍然沒有理由這樣做,僅僅因爲它假定您在應用程序中只有一個managedObjectContext,而且AppDelegate必須管理它(這就像你所說的那樣需要那種醜陋的語法)。這僅僅是一個本地化的用例來證明它的合理性。 – CodaFi

1

它是有道理的。 只需初始化您的單身人士,並將其存儲在伊娃。也就是說,你的代碼實際上定義了一個屬性,這與ivar不同。

例如,你可以定義你的單我VAR喜歡如下

@implementation WrapperClass { 
    SingletonClass * _singleton; 
} 

然後初始化單在默認構造方法

- (id)init { 
    self = [super init]; 
    if (self) { 
     //... 
     _singleton = [SingletonClass sharedInstance]; 
     //... 
    } 
    return self; 
} 
0

你可以只定義一個宏,就像這樣:

#define _SINGLETON(method) { [[SingletonClass sharedManager] method]; }

然後你可以使用它在你的代碼是這樣的:

_SINGLETON(methodName);

您可以定義此在SingletonClass.h中的宏,然後你就可以在任何地方使用它,在那裏你的頭文件被導入。 這樣你就不需要考慮iVars。

相關問題