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上帝呢?我确信我不能成为第一个想到这一点的人,但我保证,我先做了重复搜索.我找到的答案很少,我觉得它们基于旧版本的可可,因为即使是讨论过的单例模式似乎也遇到了线程问题.
你不会因为这样的类而惹恼任何 Objective-C 之神。实际上,Apple 建议在某些情况下使用该模式(我认为他们在 ARC 会话视频之一中提到了这一点,其中讨论了常见的设计模式以及如何使用 ARC 实现它们)。
在其他情况下,您可以拥有一个类的多个实例,但想要一个默认实例,您当然必须使用共享实例方法。