iPhone SDK: при выделении статической переменной я должен проверить на ноль? - PullRequest
0 голосов
/ 13 января 2011

Я часто вижу синглтон-классы, подобные следующим:

@implementation SomeImplementation

static SomeClass *sharedSomeObject = nil;

+ (void) someClassMethod {
   sharedSomeObject = [[SomeImplementation alloc] init];
   // do something
}

@end

someClassMethod может быть вызван в любое время - следует ли сначала проверять nil, прежде чем выделять новый экземпляр sharedSomeObject? Или, поскольку sharedSomeObject является статическим, проверка не нужна? Видя код, подобный этому, я всегда хочу поставить if (! SharedSomeObject) вокруг выделения.

Ответы [ 2 ]

3 голосов
/ 13 января 2011

Да, абсолютно! В противном случае вы создаете более одного объекта каждый раз, когда вызывается ваш метод. Вот как мы делаем вещи:

+ (SomeClass *) shared {
    static SomeClass    *sSingleton;

    if ( ! sSingleton ) sSingleton = [SomeClass new];

    return sSingleton;
}

EDIT

Этот ответ очень старый, не поточнобезопасный и больше не является подходящим методом инициализации синглтона. См. этот ответ Stackoverflow , чтобы узнать, как в настоящее время действовать с помощью GCD.

2 голосов
/ 14 января 2011

Когда дело доходит до использования шаблона проектирования Singleton с Objective-C, я настоятельно рекомендую использовать макрос Matt Galagher «SynthesizeSingleton.h».В нем рассматриваются все связанные с синглтоном темы, такие как освобождение (это правильное слово?) Памяти, если синглтон больше не нужен.

Вот ссылка на сайт «Какао с любовью», на котором есть статьяна эту тему, а также ссылку для загрузки заголовочного файла «SynthesizeSingleton.h»:

http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html

Вы также найдете обсуждение использования глобальных переменных и использованияШаблон проектирования Singleton, а также некоторые соображения по поводу различных подходов к использованию там Singletons.

...