【发布时间】:2013-08-19 07:58:29
【问题描述】:
所以,很简单的问题。忽略过度使用单例模式的影响。我试图在 Objective-C 中找到一个可靠的单例模式。我遇到过这个:
@implementation SomeSingleTonClass
static SomeSingleTonClass* singleInstance;
+ (SomeSingleTonClass*)getInstance
{
static dispatch_once_t dispatchOnceToken;
dispatch_once(&dispatchOnceToken, ^{
singleInstance = [[SomeSingleTonClass alloc] init];
});
return singleInstance;
}
- (void)someMethodOnTheInstance
{
NSLog(@"DO SOMET WORK")
}
@end
我对此很满意,但它导致了很多这样的事情:
[[SomeSingleTonClass getInstance] someMethodOnTheInstance];
我的问题是,为什么这比纯静态类更好。
@implementation SomeStaticClass
static NSString* someStaticStateVariable;
- (id)init
{
//Don't allow init to initialize any memory state
//Perhaps throw an exception to let some other programmer know
//not to do this
return nil;
}
+ (void)someStaticMethod
{
NSLog(@"Do Some Work");
}
您真正获得的只是看起来更干净的方法调用。基本上你换掉这个:
[[SomeSingleTonClass getInstance] someMethodOnTheInstance];
为此
[SomeStaticClass someStaticMethod];
这肯定是一个小的简化,您始终可以将实例存储在您的类中。这更像是一种求知欲,我用静态类而不是单例来惹恼什么 Objective-C 上帝?我敢肯定我不能成为第一个想到这个的人,但我保证,我先做了重复搜索。我发现的几个答案,我觉得是基于旧版本的可可,因为即使是讨论过的单例模式似乎也存在线程问题。
【问题讨论】:
-
我认为你是对的,但这个问题有点令人费解(尽管答案很可靠!)。我要留下我的,但鉴于该线程中的答案,我不需要等待鼓手回答的赞成票。这是正确的。谢谢!
-
什么是静态类?
-
一个静态类(可能有更好的名字)是一个依赖于类方法和静态类变量的类,而不是一个实例化的对象和实例方法。这就是使它成为一个方便的单例的原因。特别是如果您编写 init 方法以引发异常!
-
虽然我怀疑你是否会惹恼任何 ObjC 之神(至少不是很多 ;-)),但“静态类”是错误的命名法——在 Objective-C 中没有这样的东西。
-
作为推论,Objective-C 有类方法,但在 Objective-C 中没有静态方法。
标签: ios objective-c macos cocoa