單例設計模式詳解 基本概念 在IOS中使用單例模式的情況 非ARC環境創建單例模式的基本步驟 非ARC環境具體代碼實現 ARC環境創建單例模式的基本步驟
單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個實例而且該實例易於外界訪問
1.如果說創建一個對象會耗費很多系統資源,那麼此時采用單例模式,因為只需要一個實例,會節省alloc的時間
2.在IOS開發中,如果很多模塊都要使用同一個變量,此時如果把該變量放入單例類,則所有訪問該變量的調用變得很容易,否則,只能通過一個模塊傳遞給另外一個模塊,這樣增加了風險和復雜度
1.聲明一個單例對象的靜態實例,並初始化為nil
2.聲明一個類的工廠方法,生成一個該類的實例,並且只會生成一個
3.覆蓋allcoWithZone方法,確保用戶在alloc 時,不會產生一個多余的對象
4.實現NSCopying協議,覆蓋release,autorelease,retain,retainCount方法,以確保只有一個實例化對象
5.在多線程的環境中,注意使用@synchronized關鍵字
#import
@interface UserContext : NSObject
@property (nonatomic,retain) NSString *username;
@property(nonatomic,retain)NSString *email;
+(id)sharedUserDefault;
@end
//
// UserContext.m
// SingleDemo
//
// Created by andyyang on 9/30/13.
// Copyright (c) 2013 andyyang. All rights reserved.
//
#import "UserContext.h"
static UserContext *singleInstance=nil;
@implementation UserContext
+(id)sharedUserDefault
{
if(singleInstance==nil)
{
@synchronized(self)
{
if(singleInstance==nil)
{
singleInstance=[[[self class] alloc] init];
}
}
}
return singleInstance;
}
+ (id)allocWithZone:(NSZone *)zone;
{
if(singleInstance==nil)
{
singleInstance=[super allocWithZone:zone];
}
return singleInstance;
}
-(id)copyWithZone:(NSZone *)zone
{
return singleInstance;
}
-(id)retain
{
return singleInstance;
}
- (oneway void)release
{
}
- (id)autorelease
{
return singleInstance;
}
- (NSUInteger)retainCount
{
return UINT_MAX;
}@end
#import
#import "UserContext.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
UserContext *userContext1=[UserContext sharedUserDefault];
UserContext *userContext2=[UserContext sharedUserDefault];
UserContext *userContext3=[[UserContext alloc] init];
UserContext *userContext4=[userContext1 copy];
// insert code here...
NSLog(@"Hello, World!");
}
return 0;
}
+ (instantClass *)sharedClient {
static instantClass *_sharedClient = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedClient = [[instantClass alloc] init];
});
return _sharedClient;
}
該方法有很多優勢:
1 線程安全
2 很好滿足靜態分析器要求
3 和自動引用計數(ARC)兼容
4 僅需要少量代碼