基本概念:
單例設計模式是運用較為普遍,廣泛且較為簡單的設計模式之一,它的設計原理是
始終返回一個實例,即一個類始終只有一個實例

創建單例設計模式的基本步驟
1:聲明一個單例對象的靜態實例,並初始化為nil
2:創建一個類的類方法,生成一個該類的實例,當且僅有這個類實例nil時,進行實例化
3:覆蓋allocWithZone:方法,確保用戶直接分配和初始化的事後,不會產生新的對象
4:實現NSCopying協議,覆蓋release,autorelease,retain,retainCount方法,以此確保單例的狀態
5:在多線程的環境中,注意要使用@synchronized關鍵字,確定靜態實例被正確和初始化
單例的基本實現:
實例,UserContext.h頭文件:
#importUserContext.m實現文件:@interface UserContext : NSObject @property(nonatomic,copy)NSString *name; @property(nonatomic,copy)NSString *email; //單例 類方法 +(id)shareUserContext; @end
#import "UserContext.h"
//單例對象
static UserContext *sigletonInstance=nil;
@implementation UserContext
//生成單例對象
+(id)shareUserContext{
@synchronized(self){
if (sigletonInstance==nil) {
sigletonInstance=[[[self class] alloc]init];
}
}
return sigletonInstance;
}
//下面的方法確保只有一個實例對象
+(id)allocWithZone:(NSZone *)zone{
if (sigletonInstance==nil) {
sigletonInstance=[super allocWithZone:zone];
}
return sigletonInstance;
}
-(id)copyWithZone:(NSZone *)zone{
return sigletonInstance;
}
-(id)retain{
return sigletonInstance;
}
-(oneway void)release{
}
-(id)autorelease{
return sigletonInstance;
}
-(NSUInteger)retainCount{
return UINT_MAX;
}
@end
main.m測試代碼:
#import運行截圖#import "UserContext.h" int main(int argc, const char * argv[]) { @autoreleasepool { UserContext *userContext1=[UserContext shareUserContext]; UserContext *userContext2=[UserContext shareUserContext]; UserContext *userContext3=[[UserContext alloc]init]; UserContext *userContext4=[userContext3 copy]; [userContext1 release]; [userContext1 release]; [userContext1 release]; [userContext1 release]; NSLog(@" "); } return 0; }

看上面四個對象的內存地址一樣,說明這四個對象為同一個對象。這樣就可以實現單例了。