我们知道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
本文探讨了Objective-C中实现单例模式的方法。通过定义全局静态类实例并使用@synchronized确保线程安全,实现了单例模式。同时,文章还介绍了如何重写allocWithZone:和copyWithZone:方法来确保单例的唯一性。
2157

被折叠的 条评论
为什么被折叠?



