单例是在我们在项目学习特别是在工具类的抽取中经常用到的一种设计模式。说道底,单例就是一个类唯一的实例对象,我们无法通过alloc等其他方法来开辟一块新的内存,创建这个类的第二个实例对象。从而达到易于外界访问,节约系统资源的目的。
那么现在我们就模仿系统手动创建一个单例,首先声明一个静态的实例对象:
static Person *_per;
程序启动立即创建实例对象
//当类被加载到内存当中时,就会调用load.
+(void)load {
//1.程序一启动,就创建一个对象
Person *per = [[self alloc] init];
//类方法是不能访问当前类的成员属性.
//self.per = per;
_per = per;
}
重写系统的allocWithZone:方法
// 重写allocWithZone方法,
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
if (_per) {
NSException *exc = [NSException exceptionWithName:@"NSInternalInconsistencyException" reason:@"There can only be one Person instance." userInfo:nil];
//抛出异常
[exc raise];
}
//保持系统的默认做法
return [super alloc];
}
创建快速sharePerson方法,保证只有一个内存
+ (Person *)sharePerson {
return _per;
}
重写系统的其他构造方法
- (id)copyWithZone:(struct _NSZone *)zone
{
return _instance;
}
- (id)mutableCopyWithZone:(NSZone *)zone
{
return _instance;
}