轉自:http://www.49028c.com/lyanet/archive/2013/01/11/2856468.html
單例模式的意思就是只有一個實例。單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統提供這個實例。這個類稱為單例類。
1.單例模式的要點:
顯然單例模式的要點有三個;一是某個類只能有一個實例;二是它必須自行創建這個實例;三是它必須自行向整個系統提供這個實例。
2.單例模式的優點:
官方如下方式實現
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建議的方式顯然真正的確保了實體的唯一性
另外一種寫法是:
該寫法具有以下幾個特性:
1. 線程安全。
2. 滿足靜態分析器的要求。
3. 兼容了ARC
新聞熱點
疑難解答