我發現網上的單身模式。在我看來,它有很多可以優化的東西。Objective-C - 優化這個單例模式?
-In sharedMySingleton
方法,不需要調用保留?我不確定...
- 如果沒有,爲什麼在allocWithZone
有保留?
- @synchronized
有什麼用。 NSAssert認爲塊可以被多次調用,所以如果是的話,應該有更多的代碼來釋放先前的內存,或者不用NSAsserting就可以清楚地退出塊,如果沒有,爲什麼會出現這個NSAssert?
-和alloc
之間的鏈似乎很奇怪。我會寫我自己是這樣的:
+(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
其他方法呢?保留,retaincount,release,copyWithZone,...?你爲什麼在談論「現代」版本?現代你的意思是什麼?想知道爲什麼Apple沒有用這種代碼更新它的單例代碼片段? – Oliver 2012-04-10 08:54:56
現代,我的意思是自推出GCD。你不應該重寫這些方法。顯示覆蓋這些的唯一示例代碼在這裏:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html正如它注意到的,這是一個* strict *實現單身人士,上面解釋的文字通常是不需要的。我已經打開了一個doc案例來改進這個文檔,因爲它讓很多開發人員感到困惑。 Mike Ash在這方面有一個很好的帖子:http://www.mikeash.com/pyblog/friday-qa-2009-10-02-care-and-feeding-of-singletons.html – 2012-04-10 14:15:10
相當於10.6英寸iOS的條款? – Oliver 2012-04-11 08:52:31