一般情况我们都是这么写:
static MySingleton *shareSingleton;
+( instancetype ) sharedSingleton {
static dispatch_once onceToken;
dispatch_once ( &onceToken, ^ {
shareSingleton = [ [ MySingleton alloc ] init ] ;
} );
return sharedSingleton;
}
但是调用shareInstance方法时获取到的对象是相同的,但是当我们通过alloc和init来构造对象的时候,有时候得到的对象却是不一样的。创建对象的步骤分为申请内存(alloc)、初始化(init)这两个步骤,我们要确保对象的唯一性,因此在第一步这个阶段我们就要拦截它。当我们调用alloc方法时,oc内部会调用allocWithZone这个方法来申请内存,我们覆写这个方法,然后在这个方法中调用shareInstance方法返回单例对象,这样就可以达到我们的目的。拷贝对象也是同样的原理,覆写copyWithZone方法,然后在这个方法中调用shareInstance方法返回单例对象。所以建议以后安全一点都这么写:
static MySingleton *shareSingleton = nil;
+( instancetype ) sharedSingleton {
static dispatch_once onceToken;
dispatch_once ( &onceToken, ^ {
shareSingleton = [[super allocWithZone:NULL] init] ;
} );
return sharedSingleton;
}
+(id) allocWithZone:(struct _NSZone *)zone {
return [Singleton shareInstance] ;
}
-(id) copyWithZone:(struct _NSZone *)zone {
return [Singleton shareInstance] ;
}