objective-c - 单例模式实现

标签 objective-c ios singleton

我到处都看到单例模式的这种特殊实现:

+ (CargoBay *)sharedManager {
   static CargoBay *_sharedManager = nil;
   static dispatch_once_t onceToken;
   dispatch_once(&onceToken, ^{
      _sharedManager = [[CargoBay alloc] init];
   });
   return _sharedManager;
}

它似乎被接受为良好实践(这个特别来自 CargoBay)。

我唯一不明白的是第一行 static CargoBay *_sharedManager = nil;

为什么要将 static 变量设置为 nil

最佳答案

这只是可读性、惯例和实践的问题。这并不是真正需要的,因为:

一个。它的值(value)永远不会被检查。在旧的单例实现中,曾经有著名的

+ (id)sharedInstance
{
    static SomeClass *shared = nil;
    if (shared == nil)
        shared = [[SomeClass alloc] init];

    return shared;
}

代码 - 为了让这个方法起作用,支持变量必须初始化为 nil,因为如果它不是第一次为 nil,它会错误地省略 if 部分中的 alloc-init 并返回一个垃圾指针.然而,使用 GCD 解决方案,不再需要 nil 检查 - GCD 处理“仅执行此代码一次”编译指示。

两个。但是尽管如此:静态变量被隐式初始化为零。因此,即使您只是编写 static id shared;,它最初也会是 nil

三个。为什么这可能是个好习惯?因为,尽管我提到了前两个原因,但让源代码的读者知道某些内容已明确初始化为零仍然更具可读性。或者甚至可能存在一些不符合规范的实现,其中静态变量未正确自动初始化,然后应采取此操作。

关于objective-c - 单例模式实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12544808/

相关文章:

iphone - 关于xcode中浮点值的问题

ios - IOS上的字符串编码问题

ios - 如何在 Swift 中从文件夹中获取 UIImage 数组?

ios - UIView 隐藏/显示动画

php - 单例、传递对象、使用静态、返回错误还是全局变量?

使用 Lazy<T> 的 C# 单例模式

objective-c - 使用 AVAudioPlayer 发生内存泄漏

iOS NSURLConnection 不从某些 URL 下载文件

iphone - 可以使用导航栏返回到上一个 View 而不丢失 View 的数据吗?

angular - 无法在 Angular2 最终版本中将服务用作 SingleTon 对象