gpt4 book ai didi

objective-c - 为什么使用单例?

转载 作者:行者123 更新时间:2023-12-03 17:34:59 25 4
gpt4 key购买 nike

好吧,我知道这个问题可能看起来无关紧要或太基本,但是 - 因为我总是想知道我在做什么以及为什么这样做,如果它适合我​​的设计 - 请透露一些信息。

所以,这就是我需要的:

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

所以,假设我们有一个名为“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;
}
<小时/>

所以,这是我的问题:

  • 是同一个东西吗?
  • 如果不是,有什么区别?
  • 该方法的优点/缺点是什么? (在内存/速度/等方面)
  • 我应该使用哪一个?为什么?
  • 它们都符合我的需要吗?

最佳答案

Is it the same thing?

没有。

If not, what is the difference?

您所拥有的并没有实现单例,因为它会在每次函数调用时分配该类的新实例。它更确切地称为工厂方法。单例的定义是某个类方法始终返回该类的相同实例。

Which one should I use and why?

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

Do they both fit what I need them for?

你决定。

关于objective-c - 为什么使用单例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15183526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com