Различные способы инициализации синглетонов - PullRequest
2 голосов
/ 28 октября 2009

Работая в C # и Java, я видел в основном один способ, которым все инициализируют синглтоны:

static obj _inst = null;

obj getInstance() {
  if (_inst == null) {
    _inst = new obj();
  }
  return _inst;
}

Теперь, когда я перехожу на Objective-C для iPhone, всякий раз, когда я вижу примеры кода, я в основном вижу то же самое:

static obj _inst = nil;

+ (obj *) sharedObj {
  if (!_inst) {
    _inst = [[obj alloc] init];
  }
  return _inst;
}

Существует метод класса +initialize, который вызывается для каждого класса во время выполнения Objective C перед его использованием. Есть ли причина, по которой я не мог использовать это для создания своих синглетонов?

static obj _inst = nil;

+ (void) initialize {
  if (self == [obj class]) {
    _inst = [[obj alloc] init];
  }
}

+ (obj *) sharedObj {
  return _inst;
}

Он прекрасно работает, когда я пробую его в своем коде, и избавляется от проверки, чтобы увидеть, существует ли он каждый раз, когда к нему обращаются. Есть ли причина, по которой я не должен создавать синглтоны таким образом?

Ответы [ 3 ]

1 голос
/ 28 октября 2009

Насколько я понимаю, +initialize - это способ сделать это. Питер Хоси предлагает несколько других уловов (внутри -init и -allocWithZone:), чтобы убедиться, что вы никогда не сможете создать более одного экземпляра класса. Таким образом, делая его истинным одноэлементным классом, а не просто классом с указателем на конкретный экземпляр самого себя внутри него.

0 голосов
/ 28 октября 2009

Ленивая инициализация полностью!

Я предпочитаю этот шаблон (аналогично тому, что у вас есть):

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

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

Нет необходимости помещать это в + (void) инициализировать для синглтона, так как он будет вызван только при первой попытке использовать класс.

0 голосов
/ 28 октября 2009

При инициализации синглтона в + initialize будет всегда выделять экземпляр. Если для экземпляра требуются значительные ресурсы (включая время инициализации, которое увеличит время до того, как ваше приложение станет отзывчивым при установке), и он может не использоваться, lazy initializarion как в твоих примерах имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...