在上一節裡提到了用利用gcd快速實現單例模式。
一個項目裡面可能有好幾個類都需要實現單例模式。為了更高效的編碼,可以利用c語言中宏定義來實現。 新建一個Singleton.h的頭文件。 復制代碼 // @interface #define singleton_interface(className) / + (className *)shared##className; // @implementation #define singleton_implementation(className) / static className *_instance; / + (id)allocWithZone:(NSZone *)zone / { / static dispatch_once_t onceToken; / dispatch_once(&onceToken, ^{ / _instance = [super allocWithZone:zone]; / }); / return _instance; / } / + (className *)shared##className / { / static dispatch_once_t onceToken; / dispatch_once(&onceToken, ^{ / _instance = [[self alloc] init]; / }); / return _instance; / } 復制代碼 這裡假設了實例的分享方法叫 shared"ClassName". 因為方法名 shared"ClassName"是連在一起的,為了讓宏能夠正確替換掉簽名中的“ClassName”需要在前面加上 ## 當宏的定義超過一行時,在末尾加上“/”表示下一行也在宏定義范圍內。 注意最後一行不需要加"/”。 下面就說明下在代碼中如何調用: 這個是在類的聲明裡: 復制代碼 #import "Singleton.h" @interface SoundTool : NSObject // 公共的訪問單例對象的方法 singleton_interface(SoundTool) @end 復制代碼 這個是在類的實現文件中: 類在初始化時需要做的操作可在 init 方法中實現。 復制代碼 @implementation SoundTool singleton_implementation(SoundTool) - (id)init { } @end