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