第一、基本概念
單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱爲單例類的特殊類。通過單例模式可以保證系統中一個類只有一個實例而且該實例易於外界訪問。
第二、在IOS中使用單例模式的情況
1.如果說創建一個對象會耗費很多系統資源,那麼此時採用單例模式,因爲只需要一個實例,會節省alloc的時間
2.在IOS開發中,如果很多模塊都要使用同一個變量,此時如果把該變量放入單例類,則所有訪問該變量的調用變得很容易,否則,只能通過一個模塊傳遞給另外一個模塊,這樣增加了風險和複雜度
第三、創建單例模式的基本步驟
1.聲明一個單例對象的靜態實例,並初始化爲nil
2.聲明一個類的工廠方法,生成一個該類的實例,並且只會生成一個
3.覆蓋allcoWithZone方法,確保用戶在alloc 時,不會產生一個多餘的對象
4.實現NSCopying協議,覆蓋release,autorelease,retain,retainCount方法,以確保只有一個實例化對象
5.在多線程的環境中,注意使用@synchronized關鍵字
static MyClass *class = nil;
@implementation MyClass
+(MyClass *)sharedMyClass{
@synchronized (self){//爲了確保多線程情況下,仍然確保實體的唯一性
if (!class) {
[[self alloc] init];//非ARC模式下,該方法會調用 allocWithZone
}
return class;
}
}
+(id)allocWithZone:(NSZone *)zone{
@synchronized(self){
if (!class) {
class = [super allocWithZone:zone]; //確保使用同一塊內存地址
return class;
}
return nil;
}
}
-(id)init; {
@synchronized(self) {
if (self = [super init]){
return self;
}
return nil;
}
}
-(id)copyWithZone:(NSZone *)zone;{
return self; //確保copy對象也是唯一
}
-(id)retain{
return self; //確保計數唯一
}
-(unsigned)retainCount
{
return UINT_MAX; //裝逼用的,這樣打印出來的計數永遠爲-1
}
-(id)autorelease
{
return self;//確保計數唯一
}
-(oneway void)release
{
//重寫計數釋放方法
}