通过阅读此post,看起来在声明全局变量时应考虑某些规则。
所以我尝试在.m文件中声明全局变量。但是,代码感觉似乎不高兴为我这样做。例如,假设我在.m文件中已经有两行:
@implementation ViewController
@synthesize abc,xyz;
现在我要添加“BOOL isChecked;”。
如果我在下面输入“@synthesize”(或者只是在@implementation和@synthesize之间),代码意义实际上建议我在输入“BOOL”时输入“bool”(小写)。如果我在“@implementation”上面键入“BOOL”,它会成功建议“BOOL”。
当然,全局变量是这个类的一部分,这意味着它应该在实现中。我不确定为什么不喜欢让我们这样做。
这让我觉得Objective-C不喜欢我们在@synthesize下面声明全局变量。但我的问题是为什么?我觉得可能有一个原因或Apple在这里制造了一个错误。
答案 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 突然依赖于其他状态,如果在其他代码中直接使用它,如何更改它?)