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
相关产品推荐
相关产品推荐

