Apple的文档中的Singleton示例实际上做了什么?

时间:2012-01-09 14:31:06

标签: objective-c singleton

有人可以在Apple文档中向我解释有关Singleton实现的一些内容。

链接: - http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html

转到链接中的创建单例实例

我尝试但无法理解一些事情: -

  • +(MyGizmoClass *)sharedManager中的[super allocWithZone:NULL]是什么。?
  • 为什么allocWithZone调用sharedManger方法并在其自身返回self时返回对其返回类型的retain调用?
  • 如果Singleton中有一些实例变量,那么它们应该在哪里初始化?

如果有人可以在这里简要解释一下allocWithZone和sharedManager方法的工作,那么很多问题都会自动得到解答。

2 个答案:

答案 0 :(得分:2)

该实施通常被认为是过度杀伤。对程序员试图误用单身人士有很多保护措施,这通常被认为是不必要的。

以下是Yoga更简单实现的示例:

+ (id)sharedFoo
{
    static dispatch_once_t once;
    static MyFoo *sharedFoo;
    dispatch_once(&once, ^ { sharedFoo = [[self alloc] init]; });
    return sharedFoo;
}

答案 1 :(得分:2)

接下来 - 我已经解释了你的问题:

  

[super allocWithZone:NULL]做了什么?

这与说[super alloc]相同。 withZone部分与存储对象的内存位置有关。在实践中,使用它是非常罕见的。有关详细信息,请参阅此问题 - what is difference between alloc and allocWithZone:?

  

为什么retain方法返回自身(并且不增加保留计数器)

单身人士在你的申请期间一直保持活着 - 你不关心保留计数,因为你没有想要解除你的单身人士的情况。 retain返回self作为礼貌和约定(并允许嵌套表达式)。

  

如果Singleton中有一些实例变量,那么它们应该在哪里初始化?

由你决定。通常,您可以按照普通对象在init方法中初始化它们。