在Objective-C中声明静态变量的正确方法是什么?

Mar*_*eIV 12 objective-c static-variables

好的,在C,C++,C#和Objective-C之间切换时仍然会重新调整,所以有时我的脑袋会旋转.然而,这一次,我对于正确的方式更加困惑,因为我已经看到至少有三种不同的方式在Objective-C中声明静态变量,如果你认为它只是C本身的超集,那就是第四种.那么这些是对的?

附加问题

如果我们想要共享一个独立变量(即不是一个静态类变量,而是一个刚刚在头文件中定义的变量),那就像在'C'中那样(在标题中带有'extern'的ala)?


选项A.

foo.h中

@interface Foo : NSObject{
    static int Laa;
}

@end
Run Code Online (Sandbox Code Playgroud)

Foo.m

@implementation Foo
    ...
@end
Run Code Online (Sandbox Code Playgroud)

选项B.

foo.h中

@interface Foo : NSObject{
}

@end
Run Code Online (Sandbox Code Playgroud)

Foo.m

static int Laa; // <-- Outside of the implementation

@implementation Foo
    ...
@end
Run Code Online (Sandbox Code Playgroud)

选项C.

foo.h中

@interface Foo : NSObject{
}

@end
Run Code Online (Sandbox Code Playgroud)

Foo.m

int Laa; // <-- Note no word 'static' here like in 'Option B'

@implementation Foo
    ...
@end
Run Code Online (Sandbox Code Playgroud)

选项D.

foo.h中

static int Laa;

@interface Foo : NSObject{
}

@end
Run Code Online (Sandbox Code Playgroud)

Foo.m

@implementation Foo
    ...
@end
Run Code Online (Sandbox Code Playgroud)

选项E.

foo.h中

@interface Foo : NSObject{
}

@end
Run Code Online (Sandbox Code Playgroud)

Foo.m

@implementation Foo

    static int Laa;

    ...

@end
Run Code Online (Sandbox Code Playgroud)

奖金问题......

你是否必须使用这个词,extern或者仅当你使用.c/.c ++文件而不是.m/.mm文件时?

Ind*_*ore 16

选项A是错误的.Objective -c类没有静态varibale.
选项BE是实现静态变量的正确方法.
选项C创建一个全局变量,可以使用extern关键字在实现文件旁边访问.
选项D再次创建一个全局静态变量,只需导入.h文件即可从任何地方访问.
关于您的红利问题:extern关键字与C/C++中的含义相同.