單例模式是iOS常用設計模式中的一種。單例設計模式的作用是使得這個類的一個對象成為系統中的唯一實例,因此需要用一種唯一的方法去創建這個對象並返回這個對象的地址。那麼,我們何時使用單例模式呢?1、類只能有一個實例,而且必須從一個為人熟知的訪問點對其訪問。2、這個唯一的實例只能通過子類化進行擴展,而且擴展的對象不會破壞客戶端代碼。
根據線程安全的實現來區分,一種是使用@synchronized ,另一種是使用GCD的dispatch_once函數。
要實現單例,首先需要一個static的指向類本身的對象,其次需要一個初始化類函數。下面是兩種實現的代碼。
1、@synchronized
static InstanceClass *instance; + (InstanceClass *)defaultInstance{ @synchronized (self){ if (instance == nil) { instance = [[InstanceClass alloc] init]; } } return instance;}
2、GCD
static InstanceClass *instance; + (InstanceClass *)defaultInstance{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[InstanceClass alloc] init]; }); return instance;}
3 綜合:如果項目中用單例比較多,可以利用宏定義實現單例:(1)宏定義單例的聲明和實現方法 (2)在需要用到的object中寫入方法 (3)調用
/** * 聲明 * * @param className 類名 * * @return 獲得該類的單例 */ #define DEFINE_SINGLETON_FOR_HEADER(className) + (className *)shared##className; /** * 實現單例 * * @param className 類名 * * @return 獲得該類的單例 */ #define DEFINE_SINGLETON_FOR_CLASS(className) + (className *)shared##className { static className *shared##className = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ shared##className = [[self alloc] init]; }); return shared##className; }
在ClockManager.h文件中聲明
@interface ClockManager : NSObject /** * 獲取單例聲明 */ DEFINE_SINGLETON_FOR_HEADER(GMMobManager); @end
在ClockManager.m文件中實現
@implementation ClockManager DEFINE_SINGLETON_FOR_CLASS(ClockManager);
@end
調用
[ClockManager sharedClockManager]