【发布时间】:2013-03-03 07:40:46
【问题描述】:
好的,我知道这个问题可能看起来无关紧要或过于基本,但是 - 因为我一直想知道我在做什么以及我为什么要这样做,如果它符合我的设计 - 请阐明一下。
所以,这就是我需要的:
- 假设我们有一堂课
- 我们想在几乎任何地方使用它的方法
- 我决定使用类方法和伪全局实例,而不是传递一个对象
所以,假设我们有一个名为“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;
}
所以,这是我的问题:
- 是一回事吗?
- 如果不是,有什么区别?
- 其方法的优点/缺点是什么? (在内存/速度/等方面)
- 我应该使用哪一个?为什么?
- 它们都符合我的需要吗?
【问题讨论】:
-
@pst 你说得有道理;但是,我的问题标题似乎仍然适合我:问题不仅与实现有关,还与单例的本质/使用有关。
-
这是两个问题 - 后者已经在 SO 上进行了很好的讨论。附言我认为您在第一个示例中错过了
static。 -
@pst 你的意思是在 my 代码中?我没有错过任何东西。 (而且我没有提到它是一个单例 - 只是添加了我通常使用的代码......事实证明它是错误的......)
标签: objective-c cocoa oop class singleton