为什么要使用单身人士?

时间:2013-03-03 07:40:46

标签: objective-c cocoa oop class singleton

好的,我知道这个问题似乎无关紧要或太基本,但是 - 因为我总是想知道我在做什么以及为什么我这样做,如果它符合我的设计 - 请说清楚。

所以,这就是我需要的:

  • 假设我们有一个班级
  • 我们想在几乎任何地方使用它的方法
  • 我没有传递对象,而是决定使用类方法和伪全局实例

所以,假设我们有一个名为“MyDocumentManager”的类。


这就是我通常做的事情:

+ (MyDocumentManager*)documentManager
{
     MyDocumentManager* newDocumentManager = [[MyDocumentManager alloc] init];

     if (newDocumentManager)
     {
          // initialize that new document manager
     }
     return newDocumentManager;
}

然后使用它:

[[MyDocumentManager documentManager] someMethod];

但是,我通常会看到人们提出的建议:

+ (MyDocumentManager*)sharedManager
{
    static dispatch_once_t pred;
    static MyDocumentManager *sharedManager;
    dispatch_once(&pred, ^{
        sharedManager = [[MyDocumentManager alloc] init];
    });
    return sharedManager;
}

所以,这是我的问题:

  • 是一回事吗?
  • 如果没有,有什么区别?
  • 其方法的优点/缺点是什么? (在记忆/速度/等方面)
  • 我应该使用哪一个?为什么?
  • 他们都符合我的需要吗?

2 个答案:

答案 0 :(得分:2)

  

这是一回事吗?

没有

  

如果没有,有什么区别?

你所拥有的并没有实现单例,因为它在每次函数调用时都会分配一个新的类实例。它被称为工厂方法。单例的定义是某个类方法总是返回该类的同一个实例。

  

我应该使用哪一个?为什么?

你通常应该避免使用单身,因为它通常被认为是不好的做法,尽管有些情况下它们很方便。例如,如果你有一个使用封装数据但只需要准类级方法的类,那么实现一个具有正确放置的实例变量的单例比实现类方法和大量全局/静态变量更好(这是因为在Objective-C中,类不能有成员变量,只有对象)。

  

它们是否符合我的需要?

你决定。

答案 1 :(得分:1)

你在“我通常做的事情”中粘贴的代码被破坏了。它不会返回单例。每次调用它都会返回一个全新的对象(如果这不是ARC,那么它也会泄漏它。)

您按照人们的建议粘贴的代码是正确的代码。它不仅每次返回一个共享对象,而且不会泄漏,但它也是线程安全的(就对象的初始化而言;它没有说明对象的使用是否是线程安全的)。 / p>