Меня немного смущает этот фрагмент кода (представленный в руководстве CocoaFundamentals), который переопределяет некоторые методы при создании экземпляра синглтона.
static id sharedReactor = nil;
+(id)sharedInstance {
if(sharedReactor == nil) sharedReactor = [[super allocWithZone:NULL] init];
return sharedReactor;
}
.
+(id)allocWithZone:(NSZone *)zone {
return[[self sharedInstance] retain];
}
-(id)retain {
return self;
}
В коде, где создается экземпляр singleton, метод + sharedInstance вызывает [super allocWithZone: NILL] из суперкласса (в моем случае это NSObject). Вышеуказанный allocWithZone вызывается, только если вы пытаетесь использовать его для создания нового синглтон.
Что меня смущает, так это использование retain, особенно учитывая, что retain также отвергается, чтобы вернуть себя. Может кто-нибудь объяснить это, не может быть написано:
+(id)allocWithZone:(NSZone *)zone {
return [self sharedInstance];
}
-(id)retain {
return self;
}
EDIT_001:
Основываясь на комментариях и прочтении различных постов в Интернете, я решил перейти к следующему (см. Ниже), который я выбрал для совместного использования синглтона, где при необходимости у меня будет возможность создать второй или третий экземпляр. , Также на этом этапе, так как я использую только синглтон для модельной части MVC для простого приложения для iPhone, я решил не использовать безопасность потоков. Я знаю, что это важно, и по мере знакомства с программированием на iPhone я, скорее всего, вместо этого буду использовать + initialize (имея в виду проблему с подклассом, когда он может вызываться дважды) быть освобожденным, но также и убирать вещи должным образом, если синглтон больше не требуется.
@interface SharedManager : NSObject
+(id)sharedInstance;
@end
@implementation SharedManager
static id myInstance = nil;
+(id)sharedInstance {
if(myInstance == nil) {
myInstance = [[self alloc] init];
}
return myInstance;
}
-(void)dealloc {
NSLog(@"_deal: %@", [self class]);
[super dealloc];
myInstance = nil;
}
@end
При тестировании я обнаружил, что у меня установлена статическая переменная в nil в значении nil, или он сохранил свой указатель на исходный объект. Первоначально меня это немного смутило, поскольку я ожидал, что область действия статического объекта будет являться экземпляром, я думаю, что вместо этого это класс, что имеет смысл.
Ура Гэри