2

当我继续学习时,这本书实现了一个单例。我理解使用它的原因,但我只是想澄清一下代码。

+ (BNRItemStore *)defaultStore
{
    static BNRItemStore *defaultStore = nil;
    if(!defaultStore)
        defaultStore = [[super allocWithZone:nil] init];

    return defaultStore;
}

在行中static BNRItemStore * defaultStore = nil;直到返回语句。我的问题是;我一直在调用这个类,[[BNRItemStore defaultStore] someMethod];在另一个类或应用程序的一部分中,defaultStore 变量将设置为 nil?

干杯

4

5 回答 5

3

重要的是要了解static关键字有两种效果。一个是它使该变量在方法被调用之前存在,并在它返回后持续存在,以便它可用于下一次调用。另一个效果更微妙——初始化静态变量的“赋值”是在加载代码时执行的,而不是在调用方法时执行的。所以它不会在每次调用时都重新初始化。

但是由于变量存在于方法的“外部”,它的名称应该是唯一的——不要在这个类的另一个单例或另一个单例中使用相同的名称。

于 2012-07-17T00:58:33.327 回答
2

这是具有静态存储持续时间的变量的初始化程序。该值将在可执行文件加载到内存时设置。

请注意,没有必要将值显式设置为 nil,因为所有具有静态存储持续时间的变量都会自动设置为 0。

于 2012-07-17T00:57:41.257 回答
1

对于函数静态变量,该行

static BNRItemStore *defaultStore = nil;

不是作业。相反,它是静态初始化,它只发生一次——代码第一次通过你的函数。在随后的调用中,该值将不是nil,因为您为其分配了一个非零值。

您的实现在单线程环境中是安全的。对于并发环境,您需要添加某种形式的同步。

于 2012-07-17T00:56:03.540 回答
0

静态变量仅在第一次调用函数/方法时初始化一次。之后,你基本上可以假装这条线不存在。

于 2012-07-17T00:57:50.427 回答
-1

Apple 推荐如下内容

+ (BNRItemStore *)defaultStore
{
    static BNRItemStore *defaultStore = nil;
    static dispatch_once_t done;
    dispatch_once(&done,
                  ^{ defaultStore = [BNRItemStore alloc]init];});
    return defaultStore;
}

上面的代码假设 ARC - 如果不使用 ARC,您将不得不定义什么都不做的保留、释放、自动释放和 dealloc 方法。

于 2012-07-17T01:42:25.117 回答