一甘凭、什么是單例模式?
??單例模式火邓,從字面意思很好理解丹弱,就是有且只有一個,也就是在程序中有且只有一個實例铲咨,任何時候?qū)ζ涞脑L問躲胳,返回的都是同一個實例。
單例模式的意圖就是使得類的一個對象實例成為系統(tǒng)中的唯一實例纤勒。
??這就需要一種只允許生成對象唯一實例的機制坯苹,阻止
所有其他想要生成對象的可能。那么摇天,就可以用靜態(tài)的類方法來限制實例化的過程粹湃,從而達到有且只有一個對象的產(chǎn)生。單例模式泉坐,保證一個類有且只有一個實例为鳄,并提供一個訪問它的全局訪問點。
二腕让、單例模式
??下面的圖標識了Singleton的靜態(tài)結(jié)構(gòu)
??接下來就是在iOS的代碼中實現(xiàn)單例模式孤钦。
//Singleton.h
@interface Singleton : NSObject {
}
+ (Singleton *) sharedInstance;
- (void) operation;
@end
//Singleton.m
@implementation Singleton
static Singleton *sharedSingleton_ = nil;
- (void) operation{
// do something
NSLog(@"Singleton");
}
+ (Singleton *) sharedInstance{
if (sharedSingleton_ == nil){
sharedSingleton_ = [NSAllocateObject([self class], 0, NULL) init];
}
return sharedSingleton_;
}
+ (id) allocWithZone:(NSZone *)zone{
return [[self sharedInstance] retain];
}
@end
??單例化的實例,只能通過子類化進行擴展纯丸,而且擴展的對象不會破壞原有的代碼司训。
三、線程安全
??由于單例化的實例在程序中有且只有一份實例液南,所以在使用的過程中壳猜,或多或少的會遇到多線程的訪問問題。因此滑凉,需要在sharedSingleton_靜態(tài)實例的nil檢查周圍加入一些@synchronized()
程序塊或者使用NSLock
加鎖统扳。如果有其他屬性需要保護,也可以把它們聲明為atomic
類型畅姊。