iOS設計模式之單例模式

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






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章