- Создать статическую переменную типа синглтона и проинициализировать ее nil.
- В методе-фабрике класса создать экземпляр класса и присвоить его статической переменной.
- Переопределить метод allocWithZone: чтобы удостоверится что никто кроме класса - фабрики не сможет создать экземпляр класса.
- Реализовать методы copyWithZone:, release, retain, retainCount и autorelease (последние четыре не нужны при использования сборщика мусора).
Итого минимальный код для создания синглтона:
@implementation MySingleton
static MySingleton *sharedSingleton = nil;
+ (MySingleton*) sharedInstance {
if (sharedSingleton == nil) {
sharedSingleton = [[super allocWithZone:NULL] init];
}
return sharedSingleton;
}
+ (id)allocWithZone:(NSZone *)zone {
return [[self sharedInstance] retain];
}
- (id)copyWithZone:(NSZone *)zone {
return self;
}
- (id)retain {
return self;
}
- (NSUInteger)retainCount {
return NSUIntegerMax;
}
- (void)release {
//не делаем ничего
}
- (id)autorelease {
return self;
}
@end
@implementation MySingleton
+ (id) sharedInstance {
static MySingleton *sharedSingleton = nil;
if (sharedSingleton == nil) {
sharedSingleton = [[self alloc] init];
}
return sharedSingleton;
}
@end
@implementation MySingleton
static MySingleton *sharedSingleton = nil;
+ (void)initialize {
if (self == [MySingleton class]) {
sharedSingleton = [[self alloc] init];
}
}
+ (id) sharedInstance {
return sharedSingleton;
}
@end
Эти примеры не потокобезопасны, и для реальных задач необходимо обеспечить безопасный вызов метода sharedInstance в многопоточной среде (например с помощью двойной блокировки). Но нужно помнить, что в случае метода класса использовать конструкцию @synchronized (self) нельзя. поскольку значение self будет разным.
Комментариев нет:
Отправить комментарий