You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Singleton类与Singleton方法的区别及alloc调用实例疑问

嘿,我来给你拆解这两个问题,说得明明白白的!

Singleton类与Singleton方法的区别

首先得明确这俩不是一个层面的东西:

  • Singleton类:是遵循单例设计模式的整个类的统称。它的核心目标是确保整个应用运行期间,这个类只会存在一个实例对象。为了实现这个目标,类内部会做一系列防护——比如限制alloc、init的重复调用,处理拷贝逻辑等,同时提供一个全局的访问入口。简单说,它是一套完整的“单例实现方案”。
  • Singleton方法:就是你写的sharedInstance这类方法,它是Singleton类对外提供的唯一实例访问入口。它的逻辑通常是“如果实例不存在就创建,存在就直接返回”,是外界获取单例对象的唯一正确途径,但它只是Singleton类实现里的一部分,不能代表整个单例类的全部逻辑。
调用alloc会生成新实例吗?

答案是:如果你只实现了sharedInstance,没做其他防护的话,会!
默认情况下,alloc方法会直接分配新的内存空间,创建全新的对象实例。所以如果有人直接调用[[YourSingletonClass alloc] init],就会得到一个和sharedInstance不一样的新对象,这就破坏了单例的唯一性。

要解决这个问题,你需要在Singleton类里重写allocWithZone:方法(alloc的底层实际调用的是这个方法),让它也返回同一个单例实例。比如OC里的标准写法:

+ (id)allocWithZone:(struct _NSZone *)zone {
    static YourSingleton *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [super allocWithZone:zone];
    });
    return sharedInstance;
}

另外,为了彻底防止多实例,还要记得重写copyWithZone:和mutableCopyWithZone:方法,确保通过拷贝操作也不会生成新对象。

内容的提问来源于stack exchange,提问作者Hari c

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:19:43