iOS開發之單例模式
阿新 • • 發佈:2019-02-09
在設計模式中有一個“單例模式”,表示保證一個類只有一個例項,並提供一個訪問它的全域性訪問點。
就自己的學習和理解,參考各路大神的程式碼,簡單整理了一下單例實現程式碼。
在CocoaFoundamentalsGuide中有一段實現單例模式的示例程式碼。程式碼如下:
/* Singleton.h */
#import <Foundation/Foundation.h>;
@interface Singleton : NSObject
+ (Singleton *)instance;
@end
/* Singleton.m */
#import "Singleton.h"
static Singleton *instance = nil;
@implementation Singleton
+ (Singleton *)instance {
if (!instance) {
instance = [[super allocWithZone:NULL] init];
}
return instance;
}
+ (id)allocWithZone:(NSZone *)zone {
return [self instance];
}
- (id)copyWithZone:(NSZone *)zone {
return self;
}
- (id)init {
if (instance) {
return instance;
}
self = [super init];
return self;
}
- (id)retain {
return self;
}
- (oneway void)release {
// Do nothing
}
- (id)autorelease {
return self;
}
- (NSUInteger)retainCount {
return NSUIntegerMax;
}
@end
這是一種很標準的Singleton實現,中規中矩。不過這種實現並不是執行緒安全的。
參考很多部落格,發現eschaton的部落格中提供一個好用且好理解的單例實現方式,他給出的實現如下:
@interface SomeManager : NSObject
+ (id)sharedManager;
@end
/* 非執行緒安全的實現 */
@implementation SomeManager
+ (id)sharedManager {
static id sharedManager = nil;
if (sharedManager == nil) {
sharedManager = [[self alloc] init];
}
return sharedManager;
}
@end
/* 執行緒安全的實現 */
@implementation SomeManager
static id sharedManager = nil;
+ (void)initialize {
if (self == [SomeManager class]) {
sharedManager = [[self alloc] init];
}
}
+ (id)sharedManager {
return sharedManager;
}
@end