静态类与单身人士

时间:2013-08-16 20:05:02

标签: ios objective-c macos cocoa

所以,非常简单的问题。忽略过度使用单身模式的含义。我想在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上帝呢?我确信我不能成为第一个想到这一点的人,但我保证,我先做了重复搜索。我找到的答案很少,我觉得它们基于旧版本的可可,因为即使是讨论过的单例模式似乎也遇到了线程问题。

4 个答案:

答案 0 :(得分:19)

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

Singleton :当您有多个共享状态的方法时使用。

答案 1 :(得分:3)

我发现混合两者都很方便。我使用类似于你的第一个标准单例模式导致:

[[MyClass defaultInstance] doSomething];

但我也希望能够创建同一个类的其他实例:

MyClass *secondInstance = [[MyClass alloc] init];
[secondInstance doSomething];

当我想要更简洁地访问单例实例上的调用方法时,我按如下方式定义类方法:

// class method to call a method on the singleton instance
+ (void)doSomething
{
    [[MyClass defaultInstance] doSomething];
}

因此,我可以使用:

[MyClass doSomething];

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

第一个例子似乎是在不必要地创建类的单例类实例。我不必要地说,因为从你的其他评论看来,该类似乎没有声明任何属性或实例变量。鉴于对象的基本目的是为状态提供存储,没有实例变量的对象很少是有用的。

您的第二个示例显示了一个永远不会被实例化的类。同样,Objective-C中类的基本目的是充当实例的工厂,因此从未实例化的类并不是真正有用或必要的。

相反,您可以只提供一组C函数。 C函数根本不需要与类关联。所以考虑做这样的事情:

static NSString* someStaticStateVariable;

void someFunction(void)
{
    NSLog(@"Do Some Work");
}

这些函数可以在单独的.h / .m对中,或者可以在现有类中包含在.h / .m中(如果有意义的话)(通常,如果函数与关注点密切相关)该课程。)