一个完美的单例模式的实现方式
  不推荐直接使用:XXXClass *obj = [XXXClass [alloc] init];方式获取单例对象
  建议直接使用shareInstance获取单例对象,这样跟官方统一
  代码实现方式
/**
*  全局的static的实例,直到程序退出才被销毁
*/
static id _instance;
/**
*  控制只分配一份内存空间,alloc方法会调用这个方法来分配内存
*/
+(instancetype)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^
{
_instance = [super allocWithZone:zone];
});
return _instance;
}
/**
*  控制只初始化一次,保证[[xxx alloc] init]也是的对象
*/
-(instancetype)init
{
__block typeof(self) onceSelf = self;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^
{
onceSelf = [super init];
if(onceSelf)
{
// 自定义初始化代码
}
});
return onceSelf;
}
/**
*  提供一个类方法供外界快速获取单例对象
*/
+(instancetype)sharedInstance
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^
{
_instance = [[self alloc] init];
});
return _instance;
}
/**
*  控制拷贝对象也是同一个示例,可以不遵守<NSCopying>协议
*/
-(id)copyWithZone:(NSZone *)zone
{
return _instance;
}