標籤:
轉自:http://www.cnblogs.com/lyanet/archive/2013/01/11/2856468.html
單例模式的意思就是只有一個執行個體。單例模式確保某一個類只有一個執行個體,而且自行執行個體化並向整個系統提供這個執行個體。這個類稱為單例類。
1.單例模式的要點:
顯然單例模式的要點有三個;一是某個類只能有一個執行個體;二是它必須自行建立這個執行個體;三是它必須自行向整個系統提供這個執行個體。
2.單例模式的優點:
1.執行個體控制:Singleton 會阻止其他對象執行個體化其自己的 Singleton 對象的副本,從而確保所有對象都訪問唯一執行個體。 2.靈活性:因為類控制了執行個體化過程,所以類可以更加靈活修改執行個體化過程
IOS中的單例模式 在objective-c中要實現一個單例類,至少需要做以下四個步驟:
1、為單例對象實現一個靜態執行個體,並初始化,然後設定成nil,
2、實現一個執行個體構造方法檢查上面聲明的靜態執行個體是否為nil,如果是則建立並返回一個本類的執行個體,
3、重寫allocWithZone方法,用來保證其他人直接使用alloc和init試圖獲得一個新實力的時候不產生一個新執行個體,
4、適當實現allocWitheZone,copyWithZone,release和autorelease。
官方如下方式實現
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
{
//重寫計數釋放方法
}
再調試
MyClass *A = [[MyClassalloc] init];
NSLog(@"A:%@",A);
MyClass *B = [MyClasssharedMyClass];
NSLog(@"B:%@",B);
MyClass *C = [A copy];
NSLog(@"C:%@",C);
列印出的是
A:<MyClass: 0x6a1e130>
B:<MyClass: 0x6a1e130>
C:<MyClass: 0x6a1e130>
都是指向同一塊記憶體位址
答案已經出來了
apple建議的方式顯然真正的確保了實體的唯一性
另外一種寫法是:
- + (AccountManager *)sharedManager
- {
- static AccountManager *sharedAccountManagerInstance = nil;
- static dispatch_once_t predicate;
- dispatch_once(&predicate, ^{
- sharedAccountManagerInstance = [[self alloc] init];
- });
- return sharedAccountManagerInstance;
- }
該寫法具有以下幾個特性:
1. 安全執行緒。
2. 滿足靜態分析器的要求。
3. 相容了ARC
IOS單例模式(Singleton)