使用GCD實現(xiàn)單例纲熏,可以保證線程安全
//只要實現(xiàn)了下面copy方法妆丘,該<NSCopying>可以不用寫
@interface JKYPerson () <NSCopying>
@end
static JKYPerson *_person;
@implemention JKYPerson
- (instancetype)allocWithZone:(NSZone *)zone {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_person = [super allocWithZone:zone];
});
return _person;
}
+(instancetype)shardPerson {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_person = [[self alloc] init];
});
return _person;
}
// 為了嚴(yán)謹(jǐn)起見,應(yīng)該為單例實現(xiàn)copy方法局劲,只需返回_person即可
- (id)copyWithCZone:(NSZone *)zone
{
return _person;
}
@end
如果程序中使用單例比較多勺拣,則可以將上面但是得聲明與實現(xiàn)定義到宏里。如下:
```objc
// JKYSingleton.h
// ##號是宏連接符
#define JKYSingletonH(name) +(instanceType)share##name;
#define JKYSingletonM(name) \
static JKYPerson *_instance; \
+ (instancetype)allocWithZone:(NSZone *)zone { \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [super allocWithZone:zone]; \
}); \
return _instance; \
} \
+(instancetype)shard##name { \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [[self alloc] init]; \
}); \
return _instance; \
} \
- (id)copyWithCZone:(NSZone *)zone \
{ \
return _instance; \
}
//
// JKYPerson.h
#import "JKYSingleton.h"
@interface JKYPerson : NSObject
JKYSingletonH(Person)
@end
// JKYPerson.m
@implemention JKYPerson
JKYSingletonM(Person)
@end
注:
- 如果不是用GCD創(chuàng)建單例鱼填,而是自己寫單例药有,則必須使用
@synchronized(鎖對象){...}
加鎖 - 不同的類不能繼承同一個單例類