Цель c реализацией dispton_once синглтона лучше? - PullRequest
2 голосов
/ 05 января 2012

Я видел много людей, предлагающих использовать dispatch_once для создания синглтона:

+(MyClass *)singleton {
    static dispatch_once_t pred;
    static MyClass *shared = nil;

    dispatch_once(&pred, ^{
        shared = [[MyClass alloc] init];
    });
     return shared;
}

Почему это лучше, когда он на самом деле не поддерживает настоящий синглтон, и люди все еще могут использовать init для создания экземпляраи даже сделать релиз на sharedInstance?

Путь Apple предотвращает все эти случаи http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html Я знаю, что это не потокобезопасно, но я думаю, что легко поместить туда блок синхронизациисделать его потокобезопасным.

Ответы [ 2 ]

2 голосов
/ 05 января 2012

Почему бы просто не объединить два?

Используйте функцию, которую вы перечислили, вместо функции + (MyGizmoClass*)sharedManager от Apple, но реализуйте все переопределения allocWithZone, copyWithZone, retain, retainCount, release и autorelease.

Здесь много обсуждений: Как должен выглядеть мой синглтон Objective-C?

0 голосов
/ 04 марта 2014

Если вы хотите, чтобы он был одноэлементным, и вы беспокоитесь о том, что произойдет, если вы вызовите alloc / init: не делайте этого!Просто как тот.

* - это дела, например NSFileManager, где у вас есть как одиночный [NSFileManager defaultManager], но вы также можете иметь отдельные объекты NSFileManager *.Так что это достигается довольно легко.

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