【问题标题】:What does Singleton example in Apple's documentation actually do?Apple 文档中的 Singleton 示例实际上做了什么?
【发布时间】:2012-01-09 14:31:06
【问题描述】:

有人可以在此处向我解释有关 Apple 文档中的 Singleton 实现的一些事情吗?

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

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

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

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

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

【问题讨论】:

    标签: objective-c singleton


    【解决方案1】:

    这种实现通常被认为是 over_kill。有很多保护措施可以防止程序员试图误用通常认为没有必要的单例。

    这是来自Yoga 的更简单实现的示例:

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

    【讨论】:

    【解决方案2】:

    这里是 - 我已经解释了你的问题:

    [super allocWithZone:NULL] 是做什么的?

    这与[super alloc] 相同。 withZone 部分与您的对象将存储在内存中的位置有关。在实践中,很少使用它。有关更多信息,请参阅此问题 - what is difference between alloc and allocWithZone:?

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

    单例在您的应用程序的整个生命周期中都保持活动状态 - 您不必关心保留计数,因为在任何情况下您都不想释放您的单例。 retain 返回 self 作为礼貌和约定(并允许嵌套表达式)。

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

    由你决定。通常你会在 init 方法中初始化它们,就像一个普通的对象一样。

    【讨论】:

    • 但是调用 alloc 的 super 有什么作用呢?关于保留,我问了别的东西。保留返回自我,但为什么 allocwithzone 调用 [sharedmanager retain] ?为什么它也不只返回 self ?
    • 当你是某个东西的子类时,你总是调用[super alloc],因为你的父类需要分配它的变量。正如其他答案中提到的那样,Apple 的示例并不是这里最好的起点。
    • 哇,感谢您指出这一点。今天我的脑子有点乱 - 我的意思是 init 方法。
    猜你喜欢
    • 2020-10-29
    • 2013-06-02
    • 2020-11-21
    • 2015-02-26
    • 2017-06-29
    • 2013-06-13
    • 2021-10-25
    • 2011-08-12
    • 1970-01-01
    相关资源
    最近更新 更多