我们知道C++等语言只要通过静态对象的检测并把构造函数,赋值构造函数声明为私有成员函数就可以实现单例了。
oc也是这个原理,但是oc没有构造函数的概念,那是不是通过定义全局的静态类实例了,再接口的每次判断该实例变量是否初始化就可以了:
static singleObject *instanse;
@implementation singleObject
+(singleObject*)shareObject{
@synchronized(self){
if (instanse == nil) {
instanse = [super allocWithZone:NULL];
}
}
return instanse;
}
@implementation singleObject
+(singleObject*)shareObject{
@synchronized(self){
if (instanse == nil) {
instanse = [super allocWithZone:NULL];
}
}
return instanse;
}
但是通过如下的调用:
singleObject *obj1 = [singleObject shareObject];
singleObject *obj2 = [[singleObject alloc] init];
你会发现obj1和obj2的地址并不相同!所以我们得想办法覆盖掉alloc以copy函数:
+(id)allocWithZone:(struct _NSZone *)zone{
return [self shareObject];
}
-(id)copyWithZone:(NSZone *)zone{
return self;
}
在测试一下,看obj1和obj2的地址是不是一样!
@end