在上一節裡提到了用利用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