【问题标题】:Objective C Singleton - why the initial nil assignment?Objective C Singleton - 为什么最初的 nil 分配?
【发布时间】:2014-03-15 22:13:52
【问题描述】:

我正在用 ObjectiveC 编写一个单例,并在我查看的许多站点中看到了这个实现。我真的不明白第一个 raw 中的 nil 分配。 由于dispatch_once中的块(以我的拙见......),这个方法如何返回先前分配的值(在块内)而不是nil。

 + (id)sharedManager {
        static MyManager *sharedMyManager = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            sharedMyManager = [[self alloc] init];
        });
        return sharedMyManager;
    }

P.S - 我注意到这个问题在这里被问过一次,但没有得到解决,没有一个不发誓的人解释清楚 - Why is assigned a nil to singleton's static variable

【问题讨论】:

  • 对相关问题的评论说:前者的优点是它可以工作,后者甚至无法编译。这个假装很清楚。

标签: objective-c design-patterns singleton


【解决方案1】:

sharedMyManager = nil 分配没有必要,因为 静态变量会自动初始化为零。 您可以简单地删除它。

此外,dispatch_once() 保证分配了sharedMyManager 使用前的值。

还要注意dispatch_once() 使用onceToken 已初始化的事实 自动归零。

【讨论】:

    【解决方案2】:

    在基于 C 的语言中,例如 Objective-C,静态变量只初始化一次。所以nil 赋值只会在代码第一次执行时发生。

    然后对dispatch_once 的调用只发生一次(这就是它的目的),因此静态变量只被设置为所需的值一次。

    【讨论】:

      【解决方案3】:

      如果你不初始化你的静态变量,它最初可能会有垃圾数据。

      静态变量被初始化一次。所以在+sharedManager 消息中,声明静态变量的行只运行一次,在随后的调用中会跳过该行。

      这就是为什么这是在函数中使用静态变量的“标准方式”。

      【讨论】:

      • 在 C、Objective-C、C++ 和 Objective-C++ 中,静态变量和外部变量总是初始化为零,除非程序员写了别的东西。所以在那个时候绝对不可能有垃圾数据,自 70 年代以来这一直是 C 的一部分。
      猜你喜欢
      • 1970-01-01
      • 2011-08-16
      • 2019-11-03
      • 2018-03-09
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      相关资源
      最近更新 更多