[英]Different ways to initialize singletons
在C#和Java中工作,我基本上看到了每個人初始化單例的一種方式:
static obj _inst = null;
obj getInstance() {
if (_inst == null) {
_inst = new obj();
}
return _inst;
}
現在,當我轉到iPhone的Objective-C時,每當看到代碼示例時,我都會看到基本上相同的東西:
static obj _inst = nil;
+ (obj *) sharedObj {
if (!_inst) {
_inst = [[obj alloc] init];
}
return _inst;
}
在使用之前,在Objective-C運行時的每個類上都有一個+initialize
的類方法。 有什么原因我不能用它來創建我的單身人士嗎?
static obj _inst = nil;
+ (void) initialize {
if (self == [obj class]) {
_inst = [[obj alloc] init];
}
}
+ (obj *) sharedObj {
return _inst;
}
當我在我的代碼中嘗試它時,它工作得很好,並且無需每次訪問它之前都要檢查它是否存在。 有什么理由不應該以這種方式創建單例嗎?
就我而言, +initialize
是這樣做的方法。 彼得· -allocWithZone:
( Peter Hosey)提出了其他一些建議(在-init
和-allocWithZone:
內部),以確保您不能實例化該類的多個實例。 因此,使其成為真正的單例類,而不僅僅是使其內部具有指向其自身特定實例的指針的類。
在+ initialize中初始化單例將始終分配實例。 如果實例需要大量資源(包括初始化時間,這將延長您的應用在狀態啟動時響應的時間)並且可能不被使用,則像您的示例中那樣,延遲初始化是有意義的。
一路延遲初始化!
我更喜歡這種模式(類似於您的模式):
+ (id) sharedInstance {
static MyObject *sMyObject = nil;
if (!sMyObject) {
sMyObject = [[MyObject alloc] init];
}
return sMyObject;
}
- (oneway void) release {
// no-op
}
無需將其放在+(void)初始化中以獲得單例,因為只有在您首次嘗試使用該類時才會調用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.