无法在@interface或@protocol中声明variables

我有一个iOS应用程序,从一开始就有一个错误。 由于源代码是从模板开始构build的,因此它的appdelegate.h如下所示:

@interface myAppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window; myViewController *viewController; } BOOL myBool; // intended to be globally accessible NSString *myString; // intended to be globally accessible @end 

对于全局variables,我从其他许多.m源文件引用myBool* myString

在XCode 3.2.6下面,我不记得在编译时遇到任何问题。

在3.2.6,编译时出现警告,指向appdelegate.h中的这些“全局”variables,说:“不能在@interface或@protocol中声明variables”。 由于在编译或应用程序运行时没有进一步的问题,不幸的是我没有考虑这些警告。

现在,使用XCode 4.2,我无法编译这个源,因为以前的警告转化为构build错误。 他们引用并指向每个不同的.m文件中有“全局variables”的引用。

是否有一个简单的方法来纠正这个问题,考虑到我仍然想要访问这些variables/引用作为全球性的?

另外的问题 :当我评估到目前为止收到的答案(谢谢大家),另一个问题:任何想法为什么在XCode v3.2.6下面没有给出警告,只有在3.2.6中的警告,如果这是我真正的错误侧? 为什么代码仍然编译,可以运行没有任何问题?

他们不能去那里。 你可以把它们放在花括号内{}像这样:

 @interface myAppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window; myViewController *viewController; BOOL myBool; // intended to be globally accessible NSString *myString; // intended to be globally accessible } @end 

这使得他们成为实施课程的全球。 但是如果你希望他们在你的应用程序中的每个类都是全局的,那么你应该把它们放到你的App-Prefix.pch文件中:

 // // Prefix header for all source files of the ... project // #import <Availability.h> BOOL myBool; // intended to be globally accessible NSString *myString; // intended to be globally accessible #ifndef __IPHONE_3_0 

你是否想把它们定义为一个class上的公共成员? Objective-C中的类与您可能熟悉的其他语言中的类非常不同。 花括号之外,你只能定义方法。 如果您想创build一个公共访问的成员,请将其定义为属性:

 @interface myAppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window; myViewController *viewController; BOOL _myBool; NSString *_myString; } @property BOOL myBool; // intended to be globally accessible @property NSString *myString; // intended to be globally accessible @end 

然后在你的@implementation中做如下的事情:

 @implementation myAppDelegate @synthesize myBool = _myBool; @synthesize myString = _myString; 

然后你可以像myObject.myBool一样访问它们。

如果你只是想让它们成为这个类的所有实例的静态(“全局”)数据,那么就像其他海报所说的那样,你想把定义移动到你的.m文件中(最好声明它们是static ,不会导致链接问题)。

编译器正在抱怨@interface块中的variables,所以将它们移出它,不pipe是在@interface还是在@end之下。 你实际上可能想把它们改成标题中的extern ,然后在.m文件中实际声明它们。

C全局variables应该在.m实现文件中声明,而不是在.h头文件中声明。 一个extern声明可以在.h头文件中进行,通常在包含和声明之外。

将全局对象指针初始化为零也是一个好习惯,否则它们可能会包含一个垃圾对象引用。