Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 无法在@interface或@protocol内声明变量_Iphone_Ios - Fatal编程技术网

Iphone 无法在@interface或@protocol内声明变量

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

我从一开始就有一个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
@接口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