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

时间:2011-10-31 19:51:10

标签: 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

对于全局变量,我从许多其他.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如果这是我身边真正的错误?为什么代码仍然编译并且可以毫无问题地运行?

4 个答案:

答案 0 :(得分:30)

他们不能去那里。您可以将它们放在花括号{}中,如下所示:

@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

答案 1 :(得分:12)

您是否尝试将其定义为课程中的公共成员? 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

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

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

然后您可以myObject.myBool等方式访问它们。

如果您只是想让它们成为所有类实例的静态(“全局”)数据,那么就像其他海报所说的那样,您希望将定义移动到.m文件中(理想情况下)声明它们static,这样它们就不会引起链接问题。)

答案 2 :(得分:3)

编译器抱怨变量位于@interface块中,因此将它们移出@interface或低于@end。您实际上可能希望将它们更改为标题中的extern,并实际在.m文件中声明它们。

答案 3 :(得分:1)

C全局变量应该在.m实现文件中声明,而不是在.h头文件中声明。外部声明可以放在.h头文件中,通常在包含和接口声明之外。

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