静态类与单身人士

Chr*_*sCM 22 macos cocoa objective-c ios

所以,非常简单的问题.忽略过度使用单身模式的含义.我想在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
Run Code Online (Sandbox Code Playgroud)

我很满意,但它导致了很多这样的事情:

[[SomeSingleTonClass getInstance] someMethodOnTheInstance];
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么这比纯粹的静态类更好.

@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");
}
Run Code Online (Sandbox Code Playgroud)

所有你真正获得的,是方便的方法调用.基本上你换掉了这个:

[[SomeSingleTonClass getInstance] someMethodOnTheInstance];
Run Code Online (Sandbox Code Playgroud)

为了这

[SomeStaticClass someStaticMethod];
Run Code Online (Sandbox Code Playgroud)

这是一个小小的简化,您可以随时将实例存储在您的类中.这是更多的求知欲,使用静态类而不是单身的东西,是什么Objective-C上帝呢?我确信我不能成为第一个想到这一点的人,但我保证,我先做了重复搜索.我找到的答案很少,我觉得它们基于旧版本的可可,因为即使是讨论过的单例模式似乎也遇到了线程问题.

Pét*_*son 19

静态类:当您想要将状态无关的实用程序方法组合在一起时使用.

单例:当您有多个共享状态的方法时使用.


Dru*_*erB 1

你不会因为这样的类而惹恼任何 Objective-C 之神。实际上,Apple 建议在某些情况下使用该模式(我认为他们在 ARC 会话视频之一中提到了这一点,其中讨论了常见的设计模式以及如何使用 ARC 实现它们)。

在其他情况下,您可以拥有一个类的多个实例,但想要一个默认实例,您当然必须使用共享实例方法。

  • 没有人指出的一件事是,一个不平凡的单例(相对于静态类)可以做更多的事情,因为它是一个合法的实例。注册通知、进行键值观察、用作数据源等。 (2认同)