1.基本概念
單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱爲單例類的特殊類。通過單例模式可以保證系統中一個類只有一個實例而且該實例易於外界訪問。
注意:蘋果大量使用了此模式。例如:[NSUserDefaults standardUserDefaults], [UIApplication sharedApplication], [UIScreen mainScreen], [NSFileManager defaultManager],所有的這些方法都返回一個單例對象。
2.單例設計模式的適用情況
如果說創建一個對象會耗費很多系統資源,那麼此時採用單例模式,因爲只需要一個實例,會節省alloc的時間。
在IOS開發中,如果很多模塊都要使用同一個變量,此時如果把該變量放入單例類,則所有訪問該變量的調用變得很容易,否則,只能通過一個模塊傳遞給另外一個模塊,這樣增加了風險和複雜度
3.單例實例
新建一個接口類Singleton繼承於NSObject:
@interface Singleton : NSObject
+ (Singleton *) sharedInstance;
@end
在實現類中:
@implementation Singleton
//1.
static Singleton * sharedSingleton = nil;
+ (Singleton *) sharedInstance
{
//2.
if (sharedSingleton == nil) {
sharedSingleton = [[Singleton alloc] init];
}
return sharedSingleton;
}
@end
1.聲明一個靜態變量去保存類的實例,確保它在類中的全局可用性。
2.此方法只會執行一次,執行過後在整個生命週期不再執行,確保只有一個實例。
這種不能排除多線程的時候,同時調用出現的問題,所以爲了安全起見我們可以進行改進。有2種思路來解決這一問題。
(1)使用關鍵字@synchronized進行加鎖
@implementation Singleton
static Singleton * sharedSingleton = nil;
+ (Singleton *) sharedInstance
{
@synchronized(self)if{
if (sharedSingleton == nil) {
sharedSingleton = [[Singleton alloc] init];
}
return sharedSingleton;
}
}
@end
(2)使用Dispatch_once,在整個生命週期中,只會調用一次
@implementation Singleton
static Singleton * sharedSingleton = nil;
+ (Singleton *) sharedInstance
{
static dispatch_once_t once;
dispatch_once(&once,^{
sharedSingleton = [[Singleton alloc] init];
});
return sharedSingleton;
}
@end
這樣在常用情況下都可以使用了。但這並不是一個“嚴格”的版本。具體情況參考這篇博文
http://blog.csdn.net/abel_tu/article/details/12836961