【问题标题】:What is the proper way to declare static variables in Objective-C?在 Objective-C 中声明静态变量的正确方法是什么?
【发布时间】:2012-03-05 12:54:32
【问题描述】:

好的,在 C、C++、C# 和 Objective-C 之间切换时,我仍然会重新调整,所以有时我会头晕目眩。然而,这一次,我对正确的方法感到更加困惑,因为我已经看到了在 Objective-C 中声明静态变量的至少三种不同的方法,如果你认为它只是 C 本身的超集,还有第四种方法。那么这些哪个是正确的呢?

附加问题

如果我们想共享一个独立变量(即不是静态类变量,而是一个刚刚在头文件中定义的变量),是否与在“C”中的方式相同(在头文件中带有“extern”? )


选项 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 文件时使用?

【问题讨论】:

    标签: objective-c static-variables


    【解决方案1】:

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

    【讨论】:

    • 如果我错了,请纠正我,但属性不是特定于实例的东西,不是类级别的静态,这意味着你必须有一个类的实例来公开内部静态?
    • 这将类似地工作:stackoverflow.com/questions/695980/… 您只需自己手动编写 set / get 方法,而不是使用 @synthesize。
    • 你是对的。不过,您可以自己制作方法。见这里L stackoverflow.com/questions/695980/…
    • 编辑了我的答案 - 我不是静态变量的频繁用户。
    • 哈哈,hivemind:在 30 秒内回复了相同的链接。
    【解决方案2】:

    这取决于您所说的“静态”是什么意思。 Objective-C 得到static keyword from C,所以它与类无关。如果您尝试像在 C++ 中那样创建 class variable,那么 Objective-C 等效项只是 .m 文件中的全局变量。如果你在声明全局的时候使用了static关键字,它可以确保变量不能是extern'd并在其他文件中使用,这可能是你所追求的。

    【讨论】:

    • 所以暂时将类完全排除在外,您是说如果在 .m 文件中我只是声明 int foo; 我可以像在 C 中一样在 .h 文件中将其外部化。但是,如果我将它声明为static int foo;,再次在.m 文件中,它在其他方面完全相同但不能被外部化? Pt 2:在上面的@implementation,ala 选项 E 中声明变量(带或不带静态词)怎么样?不认为这是可能的,但这是这里另一个问题的答案。
    • 是的,默认情况下全局变量可以是extern'd,但是将全局变量设为静态会禁用它。至于第二点,在@implementation 块内声明全局完全不会影响它。它仍然只是一个普通的全局。
    【解决方案3】:

    选项 A 是错误的。 Objective -c 类没有静态变量。

    选项 BE 是实现静态变量的正确方法。

    选项 C 创建一个全局变量,可以使用 extern 关键字在实现文件之外访问。

    选项 D 再次创建一个全局静态变量,只需导入 .h 文件即可从任何地方访问。

    关于你的额外问题:extern关键字与C/C++中的含义相同。

    【讨论】:

    • 那么选项 D 就相当于使用 extern,对吗?
    • 我实际上来到这里是为了知道 B 和 E 中的哪一个是规范方法,但无论如何 +1,因为其他答案没有抓住问题的重点。我找不到明确的参考,但惯例似乎更喜欢选项 E(甚至 XCode 示例项目似乎也是这样做的)。
    • @Manav 是的,苹果样本使用 E 选项,据我所知,E & B 没有任何区别。如果你能提出不同的意见,那将是一件很棒的事情,我很想知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 2013-08-01
    • 1970-01-01
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多