Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C单例类实例初始化函数_Objective C_Singleton - Fatal编程技术网

Objective-C单例类实例初始化函数

Objective-C单例类实例初始化函数,objective-c,singleton,Objective C,Singleton,我正在学习在Objective-C中创建一个singleton类,并且遇到了这篇文章,它使用GCD来确保singleton模式得到实施。我对这个类中的instanceinit方法以及它存在的原因感到困惑 看起来当有人试图初始化MyManager实例时会调用它,但是为什么作者在这里试图初始化父类的实例([super init]) 与ObjC混淆的一个微妙点是,该语言没有静态方法。它有类方法 也就是说,前缀为+的方法被附加到类对象,并被继承,可以像实例方法一样被重写 因此,在编写单例时,单例实例的初

我正在学习在Objective-C中创建一个singleton类,并且遇到了这篇文章,它使用GCD来确保singleton模式得到实施。我对这个类中的instance
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