繁体   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