Objective-C单例类实例初始化函数
我正在学习在Objective-C中创建一个singleton类,并且遇到了这篇文章,它使用GCD来确保singleton模式得到实施。我对这个类中的instanceObjective-C单例类实例初始化函数,objective-c,singleton,Objective C,Singleton,我正在学习在Objective-C中创建一个singleton类,并且遇到了这篇文章,它使用GCD来确保singleton模式得到实施。我对这个类中的instanceinit方法以及它存在的原因感到困惑 看起来当有人试图初始化MyManager实例时会调用它,但是为什么作者在这里试图初始化父类的实例([super init]) 与ObjC混淆的一个微妙点是,该语言没有静态方法。它有类方法 也就是说,前缀为+的方法被附加到类对象,并被继承,可以像实例方法一样被重写 因此,在编写单例时,单例实例的初
init
方法以及它存在的原因感到困惑
看起来当有人试图初始化MyManager
实例时会调用它,但是为什么作者在这里试图初始化父类的实例([super init]
)
与ObjC混淆的一个微妙点是,该语言没有静态方法。它有类方法 也就是说,前缀为
+
的方法被附加到类对象,并被继承,可以像实例方法一样被重写
因此,在编写单例时,单例实例的初始化工作方式与其他实例的初始化工作方式相同,因为超类也有机会进行初始化
由于大多数单例继承自NSObject
,因此它是不可操作的
但是,有时,你最终会:
NSObject
AbstractSingletonThatIsNeverDirectlyInstantiated
ConcreteSingletonForLocalOnlyMode
ConcreteSingletonForOnlineMode
(完全是虚构的例子,但我也看到过类似的情况。)您的问题实际上与Singleton无关,因为我们几乎总是在自定义初始化方法中调用[super init]。虽然所有对象都是来自
NSObject
的子类,但您不应该随后对Singleton类进行子类化。您无法保证singleton是指基本singleton类还是指一个子类或另一个子类。(此外,我认为OPs问题要简单得多,只要问一下为什么init
调用[super init]
)@Rob在这种情况下,AbstractSingleton永远不会被实例化,但两个具体的子类会被实例化。而且,是的,在一些模式中,每种模式中有一种是完全有效的。为清晰起见进行了编辑。它类似于一个类集群,但却是一个单例集群。当然,即使基本单例是抽象的,您仍然会遇到两个单例子类的问题,因为它们共享sharedManager
和onceToken
。因此,一旦实例化了一个具体的单例,就不能正确地实例化另一个具体子类的单例。基本上,每个单例类都需要自己的sharedManager
和自己的onceToken
(或者抽象基类需要比dispatch\u once
复杂得多的东西来实现线程安全的单例工厂(!)模式);所有存在的问题。在使用类似内容的两种情况下,抽象包含共享逻辑,公共支持是在\u LocalOnlineBackingStore
单例等价物中。“本地”和“在线”共享实例可以同时存在,同时仍然通过抽象继承共享逻辑和同一组数据。我并不是说这是一个特别好的模式;但它存在并起作用。
NSObject
AbstractSingletonThatIsNeverDirectlyInstantiated
ConcreteSingletonForLocalOnlyMode
ConcreteSingletonForOnlineMode