我从一开始就构建了一个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如果这是我身边真正的错误?为什么代码仍然编译并且可以毫无问题地运行?
答案 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也是一种好习惯,否则它们可能包含垃圾对象引用。