iPhone SDK:在分配静态变量时,我应该检查nil吗?

时间:2011-01-13 03:30:55

标签: objective-c iphone-sdk-3.0 static

我经常看到设计类似于以下的单例类:

@implementation SomeImplementation

static SomeClass *sharedSomeObject = nil;

+ (void) someClassMethod {
   sharedSomeObject = [[SomeImplementation alloc] init];
   // do something
}

@end

someClassMethod可以随时调用 - 它应该在分配一个新的sharedSomeObject实例之前先检查nil吗?或者,由于sharedSomeObject是静态的,检查是否必要?看到这样的代码我总是想在分配周围加上一个if(!sharedSomeObject)。

2 个答案:

答案 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的不同方法的一些注意事项。