Я не беспокоюсь обо всем этом.Это мой шаблон:
@ реализация MyClass
-(id) init { ... } /* normal init */
+(MyClass*) defaultMyClass
{
static MyClass* theObject = nil;
@synchronized([MyClass class]) // remove synchronzed block in single threaded app
{
if (theObject == nil)
{
theObject = [[self alloc] init];
}
}
return theObject;
}
Возможно, вы можете скрыть инициализатор в расширении класса, чтобы было задокументировано, что вы не должны его использовать.
Есть также метод GCD (ниже украдено из ссылки Роба Напира), который на самом деле более легкий.
+ (id) defaultMyClass
{
static dispatch_once_t pred;
static MyClass* theObject = nil;
dispatch_once(&pred, ^{ theObject = [[self alloc] init]; });
return theObject;
}
Я всегда сопротивлялся шаблону GCD, потому что на мой взгляд это выглядит менее очевиднопроисходит.Тем не менее, это ничего не может быть исправлено с комментариемБлокировки, используемые GCD, более легкие по сравнению с @synchronized, поэтому это будет быстрее.