Используйте Singleton In Interface Builder? - PullRequest
5 голосов
/ 06 января 2011

У меня синглтон настроен так:

static Universe *instance;

+ (Universe *)instance { return instance; }

+ (void)initialize
{
    static BOOL initialized = NO;
    if(!initialized)
    {
        initialized = YES;
        instance = [[Universe alloc] init];
    }
}

- (id) init
{
    self = [super init];
    if (self != nil) {
        self.showHistory = YES;
    }
    return self;
}

но теперь я понимаю, что хотел бы создать экземпляр из Interface Builder. Я думал о том, чтобы просто врезаться в метод init, вот так

    if (instance) 
         return instance;

это плохая идея? Я бы предпочел, чтобы IB взял экземпляр, уже созданный в методе +initialize.

Ответы [ 2 ]

6 голосов
/ 06 января 2011

Это можно сделать.Об этом есть раздел в Какао-шаблонах Бака и Яхтмана.

В вашем случае вы можете сделать что-то вроде:

static Universe *instance;

+ (Universe *)instance { return instance; }

+ (id)hiddenAlloc
{
  return [super alloc];
}

+ (id)alloc
{
  return [[self instance] retain];
}

+ (void)initialize
{
    static BOOL initialized = NO;
    if(!initialized)
    {
        initialized = YES;
        instance = [[Universe hiddenAlloc] init];
    }
}

- (id)init
{
  if(instance==nil) // allow only to be called once
  {
    // your normal initialization here
  }
  return self;
}

Перозагрузка кода тогда правильно подберет синглтон через его вызов к [[Universe alloc] init], и вы все равно можете использовать instance в своем коде, как и раньше.

Книга содержит больше деталей и рекомендует реализовать new и allocWithZone (оба просто как return [self alloc];), а также заглушки для отчетов об ошибках, чтобы поймать copyWithZone и mutableCopyWithZone попытки для хорошей меры.

1 голос
/ 06 января 2011

Это будет течь.Вы можете сойти с рук, если вы измените его на:

if(instance) {
    [self release];
    return instance;
}

, но он все еще пахнет для меня немного.Мне любопытно, что вы используете для одиночных игр в IB;Я подозреваю, что я бы избежал этой конструкции в моем коде.

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