Синглтон: где создать экземпляр? - PullRequest
0 голосов
/ 09 марта 2010

Есть ли у кого-нибудь какие-либо предпочтения или комментарии по поводу использования ...

static id sharedReactor = nil;

+(id)sharedInstance {
if(sharedReactor == nil) sharedReactor = [[super allocWithZone:NULL] init];
return sharedReactor;
}

OR

static id sharedReactor = nil;

+(void)initialize {
if(sharedRandomReactor == nil) {
sharedRandomReactor = [[super allocWithZone:NULL] init];
}

+(id) sharedInstance {
    return sharedReactor;
}

На мой взгляд, использование + (void) initialize кажется более элегантным, мне просто интересно, что люди с большим опытом, чем я, думают об обоих подходах?

1011 * Гэри *

Ответы [ 6 ]

2 голосов
/ 09 марта 2010

С Сайт Майка Эша Вот еще один способ использования Grand Central Dispatch:

+ (id)sharedWhatever
{
    static dispatch_once_t pred;
    static Whatever *whatever = nil;
    dispatch_once(&pred, ^{
        whatever = [[Whatever alloc] init];
    });
    return whatever;
}
0 голосов
/ 11 марта 2010

Я только что заметил запись в блоге от bbum , обновляя возможность того, что + initialize может выполняться несколько раз, если подкласс не реализует его, а суперкласс делает. Пока вы помните об этом, + (void) инициализация вполне может быть лучшим вариантом, особенно если вам нужна безопасность потоков и вы не хотите использовать @synchronized. Сказав это, если вы просто ищете простой синглтон для использования в качестве модели совместно используемых данных и не беспокоитесь о безопасности потоков, переходите к первому.

0 голосов
/ 10 марта 2010

Я всегда следовал советам из руководства Основы какао от Apple . Таким образом, не имеет значения, создается ли экземпляр класса несколько раз или к нему осуществляется доступ через метод класса sharedInstance, возвращаемый объект всегда одинаков.

В руководстве также подчеркивается переопределение сохранения / выпуска, чтобы предотвратить его восстановление. Просто к вашему сведению.

0 голосов
/ 09 марта 2010

Это путь ...

static id sharedReactor = nil;

+(id)sharedInstance {
if(sharedReactor == nil) sharedReactor = [[super allocWithZone:NULL] init];
return sharedReactor;
}

Намного понятнее от обоих методов.

0 голосов
/ 09 марта 2010

Проблема с первым вариантом заключается в том, что теперь у вас есть еще одна ответственность, которая вызывает «Initialize» => больше возможных ошибок.

Однако преимущество второго состоит в том, что после инициализации первого экземпляра код больше не проверяет, равен ли он нулю, поэтому он экономит несколько циклов ЦП.

Хотя я бы пошел с первым ..

0 голосов
/ 09 марта 2010

Я предпочитаю +(id)instance и локальную статику внутри самого метода. (больше похоже на первый пример)

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