我经常看到设计类似于以下的单例类:
@implementation SomeImplementation
static SomeClass *sharedSomeObject = nil;
+ (void) someClassMethod {
sharedSomeObject = [[SomeImplementation alloc] init];
// do something
}
@end
someClassMethod可以随时调用 - 它应该在分配一个新的sharedSomeObject实例之前先检查nil吗?或者,由于sharedSomeObject是静态的,检查是否必要?看到这样的代码我总是想在分配周围加上一个if(!sharedSomeObject)。
答案 0 :(得分:3)
是的,绝对!否则,每次调用方法时都会创建多个对象。这就是我们做事的方式:
+ (SomeClass *) shared {
static SomeClass *sSingleton;
if ( ! sSingleton ) sSingleton = [SomeClass new];
return sSingleton;
}
这个答案很老,不是线程安全的,不再是一个合适的单例初始化方法。有关GCD现在正确处理事情的方法,请参阅this Stackoverflow answer。
答案 1 :(得分:2)
当谈到使用带有Objective-C的Singleton设计模式时,我强烈推荐使用Matt Galagher的“SynthesizeSingleton.h”宏。它处理所有与singelton相关的主题,如释放(这是一个正确的单词吗?)内存,如果不再需要单身人士。
以下是“Cocoa with Love”网站的链接,其中包含有关此主题的文章以及下载“SynthesizeSingleton.h”头文件的链接:
http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html
您还将找到关于使用全局变量与使用Singleton设计模式的讨论,以及对在那里使用Singletons的不同方法的一些注意事项。