单例:整个程序只创建一次,全局共用。
- 单例的创建
// SharedPerson.h 文件中
+ (instancetype)share;// SharedPerson.m 文件中 static SharedPerson *_person; + (instancetype)allocWithZone:(struct _NSZone *)zone{ static dispatch_once_t predicate; dispatch_once(&predicate, ^{ _person = [super allocWithZone:zone]; }); return _person; } + (instancetype)share { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _person = [[self alloc]init]; }); return _person; }
- (id)copyWithZone:(NSZone *)zone { return _person; } - 分析单例
-
- static SharedPerson *_person : 利用static关键字来确保创建的单例对象_person只能在此类中可以访问到;将_person定义成全局变量为了确保其生命周期存在于整个程序中,期间不被销毁.
-
- dispatch_once : 此函数确保_person对象在程序中只会创建一次,并且也保证了创建时的线程安全。
-
- + (instancetype)share : 提供便捷的类方法来创建单例对象,强烈建议用此法创建对象。
-
+ (instancetype)allocWithZone:(struct _NSZone *)zone : [SharedPerson alloc]分配对象内存时,实际会调此函数allocWithZone:(struct _NSZone *)zone,所以需要重写此方法来保证单例对象只会创建一次,而且是必须重写此方法,防止其他开发者直接用初始化方法来创建单例对象。
-
- (id)copyWithZone:(NSZone *)zone : 此函数来保证单例对象可以copy再得到一个一模一样的对象。