簡體   English   中英

初始化單例的不同方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM