Zastanawiam się, gdzie jest najlepsze miejsce do inicjowania członków klasy singleton.Kakao - Obiekt Singleton: Gdzie zainicjować zmienne składowe?
Używam wdrożenia podstawowego singleton firmy Apple. Czy mógłbyś wskazać, w którym wierszu pojawiają się inicjały? Kod jest następujący:
static MyGizmoClass *sharedGizmoManager = nil;
+ (MyGizmoClass*)sharedManager
{
@synchronized(self) {
if (sharedGizmoManager == nil) {
[[self alloc] init]; // assignment not done here
}
}
return sharedGizmoManager;
}
+ (id)allocWithZone:(NSZone *)zone
{
@synchronized(self) {
if (sharedGizmoManager == nil) {
sharedGizmoManager = [super allocWithZone:zone];
return sharedGizmoManager; // assignment and return on first allocation
}
}
return nil; //on subsequent allocation attempts return nil
}
- (id)copyWithZone:(NSZone *)zone
{
return self;
}
- (id)retain
{
return self;
}
- (unsigned)retainCount
{
return UINT_MAX; //denotes an object that cannot be released
}
- (void)release
{
//do nothing
}
- (id)autorelease
{
return self;
}
Możesz przeczytać http://boredzo.org/blog/archives/2009-06-17/doing-it-wrong. Czy naprawdę chcesz singleton, który zastępuje wydanie? To tylko maskuje błędy. –
Zanim przypomnisz Jona Hessa, że śledzisz dokumenty Apple'a: Napisałem ten wpis właśnie w odpowiedzi na dokumenty Apple. –
Warto również zauważyć, że klasy nie mają żadnych "członków". Najbliższym, jakie można uzyskać, jest zmienna statyczna w pliku implementacyjnym klasy. A członkowie klasy nie są tym, co i tak chcesz zainicjować. Miałeś na myśli zmienne * instance * instancji singleton *. –