无法在@interface或@protocol中声明变量

cac*_*dev 21 iphone ios

我从一开始就构建了一个iOS应用程序,其中包含错误.由于源是从模板开始构建的,因此它的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
Run Code Online (Sandbox Code Playgroud)

我从许多其他.m源文件中引用myBool*myString,以及全局变量.

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

在3.2.6,在编译时出现警告,指向appdelegate.h中的这些"全局"变量,说:"不能在@interface或@protocol中声明变量".由于编译或应用程序运行时没有其他问题,遗憾的是我没有考虑这些警告.

现在,使用XCode 4.2,我无法编译此源,因为以前的警告变成了构建错误.它们引用并指向不同.m文件中的每一行,其中存在对"全局变量"的引用.

有没有一种简单的方法可以解决这个问题,考虑到我仍然想要将这些变量/引用作为全局变量/引用来访问?

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

Sim*_*n G 32

他们不能去那里.你可以把它们放在大括号{}里面,如下所示:

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

@end
Run Code Online (Sandbox Code Playgroud)

这使它们成为实现类的全局.但是,如果您希望它们对应用程序中的每个类都是全局的,那么您应该将它们放在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
Run Code Online (Sandbox Code Playgroud)


flu*_*ffy 13

您是否尝试将它们定义为类中的公共成员?Objective-C中的类与您可能熟悉的其他语言有很大不同.在花括号之外,您只能定义方法.如果要创建可公开访问的成员,请将它们定义为属性:

@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
Run Code Online (Sandbox Code Playgroud)

然后在@implementation中执行以下操作:

@implementation myAppDelegate
@synthesize myBool = _myBool;
@synthesize myString = _myString;
Run Code Online (Sandbox Code Playgroud)

然后你可以访问它们myObject.myBool等等.

如果您只是想让它们成为类的所有实例的静态("全局")数据,那么就像其他海报所说的那样,您希望将定义移动到您的.m文件中(并且理想地声明它们static以便它们不会导致链接问题).

  • 好吧,那么从长远来看你可能想要做的就是将它们放在任何`@interface`之外的.h文件中并声明它们是`extern`,然后有一个匹配的源文件来声明变量本身(没有任何修饰语).如果您在.h中将它们声明为非extern,那么您可能会遇到链接问题. (2认同)