ios 单例(arc版本)

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们知道C++等语言只要通过静态对象的检测并把构造函数,赋值构造函数声明为私有成员函数就可以实现单例了。
oc也是这个原理,但是oc没有构造函数的概念,那是不是通过定义全局的静态类实例了,再接口的每次判断该实例变量是否初始化就可以了:

static singleObject *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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值