单例模式可以保证在程序运行的过程中,一个类只存在一个对象,而且该实例易于供外界访问。这个对象只有在该程序运行结束后才会销毁。
因为只存在一个对象,所以我们保证每次调用alloc生成的对象是同一块地址即可,但是使用alloc的时候,alloc会调用其父类的allocwithzone方法分配内存,所以我们要重写allocwithzone方法
实现单例模式有两种方法。
方法1:GCD方式实现
1.allocwithzone方法的重写
static Person *_person;
+(instancetype)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_person = [super allocWithZone:zone];
});
return _person;
}
2.实现单例的shared方法
+ (instancetype)sharedPerson
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_person = [[self alloc] init];
});
return _person;
}
3.重写copy方法
@interface Person() <NSCopying>
@end
- (id)copyWithZone:(NSZone *)zone
{
return _person;
}
方法二:加锁实现
1.allocwithzone方法的重写
static Person *_person;
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
@synchronized (self) {
if (_person == nil) {
_person = [super allocWithZone:zone];
}
}
return _person;
}
2.实现单例的shared方法
+ (instancetype)sharedPerson
{
@synchronized (self) {
if (_person == nil) {
_person = [[self alloc] init];
}
}
return _person;
}
3.重写copy方法
@interface Person() <NSCopying>
@end
- (id)copyWithZone:(NSZone *)zone
{
return _person;
}