初始化单身人士的不同方式

时间:2009-10-28 14:31:49

标签: objective-c iphone singleton

在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;
}

当我在我的代码中尝试它时,它工作正常,并且它在每次访问之前都不会检查它是否存在。我有什么理由不这样做单身吗?

3 个答案:

答案 0 :(得分:1)

就我而言+initialize是做到这一点的方法。 Peter Hosey建议了几个其他捕获(在-init-allocWithZone:内)以确保您无法实例化该类的多个实例。从而使它成为一个真正的单例类,而不仅仅是一个带有指向其中特定实例的指针的类。

答案 1 :(得分:0)

在+ initialize中初始化单例将始终分配实例。如果实例需要大量资源(包括初始化时间,这会延长应用程序在statup响应之前的时间)并且可能不会被使用,懒惰的初始化, 在你的例子中是有道理的。

答案 2 :(得分:0)

一直懒惰的初始化!

我更喜欢这种模式(类似于你所拥有的):

+ (id) sharedInstance {
     static MyObject *sMyObject = nil;
     if (!sMyObject) {
         sMyObject = [[MyObject alloc] init];
     }
     return sMyObject;
}

- (oneway void) release { 
     // no-op
}

没有必要将它放在 +(void)初始化中用于单例,因为它只会在您第一次尝试使用该类时被调用。