为什么为单例的静态变量赋值为nil

mel*_*nye 5 null singleton static objective-c

使用它有什么好处:

+ (CardPainter*) sharedPainter {
    static CardPainter* sp = nil;

    if (nil == sp) {
        sp = [[CardPainter alloc] init];
    }

    return sp;
}
Run Code Online (Sandbox Code Playgroud)

而不是这个:

+ (CardPainter*) sharedPainter {
    static CardPainter* sp = [[CardPainter alloc] init];

    return sp;
}
Run Code Online (Sandbox Code Playgroud)

静态变量初始化只执行一次,所以我看不到前者的优点.

Ver*_*ig0 -2

因为如果你不问,你就会在任何时候调用“sharedPainter”时启动“*sp”,从而丢失任何数据。

因此,如果您询问 sp 是否为 nil 并且答案为 FALSE,则表示“sp”已经初始化并且它返回实例。如果答案为真,则意味着 sp 未初始化,在这种情况下您将调用 init 函数。

  • 不。除了第二个示例无法编译这一事实之外,由于我在答案中解释的原因,即使它编译了,它也不会像您所描述的那样运行。静态变量仅在启动时(本质上)初始化为其分配的值一次。如果不是,它们与非静态局部变量没有什么不同,并且第一个示例的形式也没有任何意义。 (2认同)