在Objective-C中,是否有任何特定的规则来声明.m文件中的全局变量?

时间:2011-12-20 17:07:23

标签: objective-c global-variables declaration

通过阅读此post,看起来在声明全局变量时应考虑某些规则。

所以我尝试在.m文件中声明全局变量。但是,代码感觉似乎不高兴为我这样做。例如,假设我在.m文件中已经有两行:

@implementation ViewController
@synthesize abc,xyz;

现在我要添加“BOOL isChecked;”。

如果我在下面输入“@synthesize”(或者只是在@implementation和@synthesize之间),代码意义实际上建议我在输入“BOOL”时输入“bool”(小写)。如果我在“@implementation”上面键入“BOOL”,它会成功建议“BOOL”。

当然,全局变量是这个类的一部分,这意味着它应该在实现中。我不确定为什么不喜欢让我们这样做。

这让我觉得Objective-C不喜欢我们在@synthesize下面声明全局变量。但我的问题是为什么?我觉得可能有一个原因或Apple在这里制造了一个错误。

3 个答案:

答案 0 :(得分:5)

  

当然,全局变量是这个类的一部分,这意味着它应该在实现中。我不确定为什么不喜欢让我们这样做。

全局变量不是类的一部分。当然,你可以把它们放在@implementation区块内,但它们真的不属于班级 - 它们是全球性的 - 所以它们并不真正属于那里。

Objective-C没有类似Java或其他语言的类变量。你可以使用访问这些变量的全局变量和类方法伪造它们,但最终它们是全局的,而不是特定于类。

答案 1 :(得分:0)

IDE的代码意义帮助建议并不是Objective C语言“喜欢”的绝对标志。在类实现之外或之内放置一个全局变量会从Xcode Objective C编译器生成等效的编译结果,并且没有警告。

然而,将这些声明放在类实现之外可能被认为是更好的代码样式,因为所有全局变量实际上都具有全局范围,而不是类范围。

此外,您可能希望为全局变量分配初始值,而不是在代码中对可能的内容进行任何假设。

答案 2 :(得分:0)

Objective-C没有类变量。您声明了一个C全局变量。我就是这样做的:

声明一个静态C变量。在你的情况下:

static BOOL isChecked = NO;

请注意我已初始化它。请注意,它被声明为static,这限制了它对声明它的.m文件的可见性。

如果你想要一个全局对象,比如数组,你需要初始化它:

static NSArray *myArray;

@implementation MyClass

+ (void)initialize {
    if (self == [MyClass class]) {
        myArray = [NSArray arrayWithObjects: ... ];
    }
}

@end

注意 if(self == [MyClass class])检查。 + initialize 将被调用一次或多次。在第一次使用 MyClass 时(例如,调用 + alloc )。可能是第一次使用 MyClass 的任何子类时。因此,检查您是否实际上正在初始化MyClass或其子类。

最后,如果要在声明它的代码之外访问此变量,请创建一个访问者:

+ (BOOL)isChecked {
    return isChecked;
}

不要通过删除 static 修饰符来公开全局C变量。这使得调试,重构或重新实现变得更加困难(如果 isChecked 突然依赖于其他状态,如果在其他代码中直接使用它,如何更改它?)