第一种: GCD实现 (推荐使用)
新建一个Person类,在.h文件中添加方法
@interface Person : NSObject
+(instancetype)sharePerson;
@end
在.m文件中添加方法
#import "Person.h"
@interface Person()
@end
@implementation Person
static Person *_person;
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_person = [super allocWithZone:zone];
});
return _person;
}
+ (instancetype)sharePerson{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_person = [[super alloc] init];
});
return _person;
}
- (id)copyWithZone:(NSZone *)zone{
return _person;
}
@end
第二种: 通过重写类方法实现
新建一个Person类,在.h文件中添加方法
@interface Person : NSObject
+ (instancetype)sharePerson;
@end
在.m文件中添加方法
#import "Person.h"
@implementation Person
static Person *_person;
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
@synchronized (self) {
if (_person == nil) {
_person = [super allocWithZone:zone];
}
};
return _person;
}
+ (instancetype)sharePerson{
@synchronized (self) {
if (_person == nil) {
_person = [[super alloc] init];
}
}
return _person;
}
- (id)copyWithZone:(NSZone *)zone{
return _person;
}
@end
注:
- 在第二种创建单例中, 必须对重写方法进行加锁, 因为考虑到线程安全问题,如果不加锁, 可能两个线程同时访问, 就会出现分配两个内存空间的情况..
- 单例的实现不能使用继承, 这样会造成所有继承的单例都是同一个对象
网友评论