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

时间:2012-02-14 05:18:08

标签: 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

Foo.m

@implementation Foo
    ...
@end

选项B

foo.h中

@interface Foo : NSObject{
}

@end

Foo.m

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

@implementation Foo
    ...
@end

选项C

foo.h中

@interface Foo : NSObject{
}

@end

Foo.m

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

@implementation Foo
    ...
@end

选项D

foo.h中

static int Laa;

@interface Foo : NSObject{
}

@end

Foo.m

@implementation Foo
    ...
@end

选项E

foo.h中

@interface Foo : NSObject{
}

@end

Foo.m

@implementation Foo

    static int Laa;

    ...

@end

奖金问题......

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

3 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:3)

这取决于你所说的“静态”。 Objective-C获取static keyword from C,因此它与类无关。如果您试图像在C ++中那样创建class variable,那么Objective-C等价物只是.m文件中的全局内容。如果在声明全局时使用static关键字,则可以确保该变量不能extern并在其他文件中使用,这可能就是您所追求的。

答案 2 :(得分:0)

由于您提供了多种选择,我必须使用选项A.这是针对仅在类中可见的静态变量。要在外部访问它,您需要编写类似于this answer的自定义getter和setter方法。