Znalazłem ten singletonowy wzór w sieci. Wydaje mi się, że ma wiele rzeczy, które można zoptymalizować.Objective-C - Optymalizacja tego singletonowego wzoru?
-In sharedMySingleton
metoda, nie trzeba wywoływać zatrzymania? Nie jestem pewien ...
-Jeśli nie, to dlaczego jest przechowywany w allocWithZone
?
-jaki jest pożytek z @synchronized
. W NSAssert myślę, że blok może być wywołany wiele razy, więc jeśli tak, powinien istnieć jakiś kod do wydania poprzedniej pamięci lub wyjść z klocka wyraźnie, nie tylko przez NSAsserting, a jeśli nie, to dlaczego istnieje ten NSAssert?
-wiązanie beetween sharedMySingleton
i alloc
wydaje się dziwne. ja bym napisał coś takiego:
+(MySingleton*)sharedMySingleton
{
@synchronized([MySingleton class])
{
if (_sharedMySingleton == nil) _sharedMySingleton = [[self alloc] init];
return _sharedMySingleton;
}
return nil;
}
+(id)alloc
{
@synchronized([MySingleton class])
{
return [super alloc];
}
return nil;
}
Singleton
#import "MySingleton.h"
@implementation MySingleton
// ##########################################################################################################
// ######################################## SINGLETON PART ##################################################
// ##########################################################################################################
static MySingleton* _sharedMySingleton = nil;
// =================================================================================================
+(MySingleton*)sharedMySingleton
// =================================================================================================
{
@synchronized([MySingleton class])
{
if (_sharedMySingleton == nil) [[self alloc] init];
return _sharedMySingleton;
}
return nil;
}
// =================================================================================================
+(id)alloc
// =================================================================================================
{
@synchronized([MySingleton class])
{
NSAssert(_sharedMySingleton == nil, @"Attempted to allocate a second instance of a singleton.");
_sharedMySingleton = [super alloc];
return _sharedMySingleton;
}
return nil;
}
+ (id)allocWithZone:(NSZone *)zone { return [[self sharedMySingleton] retain]; }
- (id)copyWithZone:(NSZone *)zone { return self; }
- (id)retain { return self; }
- (NSUInteger)retainCount { return NSUIntegerMax; /* denotes an object that cannot be released */}
- (oneway void)release { /* do nothing */ }
- (id)autorelease { return self; }
// ##########################################################################################################
// ##########################################################################################################
// ##########################################################################################################
// =================================================================================================
-(id)init
// =================================================================================================
{
if (!(self = [super init])) return nil;
return self;
}
// =================================================================================================
-(void) dealloc
// =================================================================================================
{
[super dealloc];
}
// =================================================================================================
-(void)test
// =================================================================================================
{
NSLog(@"Hello World!");
}
@end
Co z innymi metodami: zachowaj, zatrzymaj, zwolnij, copyWithZone, ...? Dlaczego mówisz o "nowoczesnych" wersjach? Co masz na myśli przez współczesność? Czy jest jakiś pomysł, dlaczego Apple nie zaktualizował swojego singleton snippet z tego rodzaju kodu? – Oliver
Przez nowoczesne, mam na myśli od czasu wprowadzenia GCD. Nie powinieneś zastępować tych metod. Jedyny przykładowy kod, który pokazuje ich nadpisanie, znajduje się tutaj: https://developer.apple.com/library/mac/#documentation/Cocoa/Conoa/CocoaFundamentals/CocoaObjects/CocoaObjects.html Jak zauważa, jest to * ścisłe * wdrożenie singletonu, który powyższy tekst wyjaśnia, jest generalnie niepotrzebny. Otworzyłem przypadek doc, aby ulepszyć tę dokumentację, ponieważ jest niejasna dla wielu programistów. Mike Ash ma dobry post na ten temat: http://www.mikeash.com/pyblog/friday-qa-2009-10-02-care-and-feeding-of-singletons.html –
Co to jest odpowiednik 10,6 w warunki iOS? – Oliver