Iphone 无法在@interface或@protocol内声明变量
我从一开始就有一个iOS应用程序,其中有一个错误。由于源是从模板开始构造的,因此其appdelegate.h如下所示:Iphone 无法在@interface或@protocol内声明变量,iphone,ios,Iphone,Ios,我从一开始就有一个iOS应用程序,其中有一个错误。由于源是从模板开始构造的,因此其appdelegate.h如下所示: @interface myAppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window; myViewController *viewController; } BOOL myBool; // intended to be globally accessibl
@interface myAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
myViewController *viewController;
}
BOOL myBool; // intended to be globally accessible
NSString *myString; // intended to be globally accessible
@end
@接口myAppDelegate:NSObject{
UIWindow*窗口;
myViewController*viewController;
}
BOOL myBool;//旨在全球访问
NSString*myString;//旨在全球访问
@结束
对于全局变量,我从许多其他.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中的警告,如果这是我方的真实错误?为什么代码仍然被编译并且可以毫无问题地运行?C全局变量应该在.m实现文件中声明,而不是在.h头文件中声明。extern声明可以放在.h头文件中,通常在include声明之后和接口声明之外
最好将全局对象指针初始化为nil,否则它们可能包含垃圾对象引用。编译器抱怨变量位于
@interface
块中,因此将它们移出@interface
块,或者移到@interface
上方或@end
下方。实际上,您可能希望在头中将它们更改为extern
s,并在.m文件中声明它们。是否尝试将它们定义为类上的公共成员?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
然后可以通过myObject.myBool
等方式访问它们
如果您只是试图将它们转换为类的所有实例的静态(“全局”)数据,那么正如其他海报所说的,您希望将定义移动到
.m
文件中(理想情况下,将它们声明为静态
,这样它们就不会引起链接问题)。它们无法到达那里。您可以将它们放在大括号{}中,如下所示:
@interface myAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
myViewController *viewController;
BOOL myBool; // intended to be globally accessible
NSString *myString; // intended to be globally accessible
}
@end
@接口myAppDelegate:NSObject{
UIWindow*窗口;
myViewController*viewController;
BOOL myBool;//用于全局访问
NSString*myString;//用于全局访问
}
@结束
这使得它们在实现类中是全局的。但是,如果您希望它们对应用程序中的每个类都是全局的,那么您应该将它们放到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
//
//所有源文件的前缀头。。。项目
//
#进口
BOOL myBool;//旨在全球访问
NSString*myString;//旨在全球访问
#ifndef\uuuIphone\u3\u0
我正试图使它们可用于项目中的所有类(这就是为什么我说“全局”)。所以我想让它们可以从所有的.m文件中访问。好的,那么从长远来看,您可能想做的是将它们放在任何@接口
等外部的.h文件中,并声明它们外部
,然后有一个匹配的源文件来声明变量本身(没有任何修改)。如果在.h中声明它们为非外部变量,则可能会遇到链接问题。我最后所做的是创建一个单独的“global_variables.h”文件,将所有这些变量放入其中,并将其包含在appdelegate.h中,并使用#import,这样就可以了!:)老实说,这是我见过的最难看的语法组合。我知道这是预编译标志,但它太乱了。警告一句,在面向对象编程中,这种意义上的“全局”变量通常是个坏主意,因为它们不利于局部性和封装。网上有很多关于这个主题的阅读。
//
// 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