一.注意:
如果不重写allocWithZone和copyWithZone的话,在调用alloc和init或者new时,会创建除单利对象外的另一个对象,这个可以通过打印对象的内存地址观察,所以注意需要复写这两个方法
二.代码演示:
1.OC版:
static Person *person;
+ (instancetype)shareInstance
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
person = [[self alloc] init] ;
}) ;
return person;
}
+ (id)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
person = [super allocWithZone:zone];
}) ;
return instance;
}
- (id)copyWithZone:(NSZone *)zone
{
return person;
}
2.Swift版:
class Person {
static let sharePerson : Person = Person()
// 必须禁用构造方法
private init() {}
}