English 中文(简体)
无法在@interface或@protocol内声明变量
原标题:Cannot declare variable inside @interface or @protocol
  • 时间:2011-10-31 19:51:09
  •  标签:
  • 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中发出警告吗?为什么代码仍然被编译并且可以毫无问题地运行?

最佳回答

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

@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
问题回答

你是否试图将他们定义为类中的公共成员?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 myAppDelegate
@synthesize myBool = _myBool;
@synthesize myString = _myString;

然后,您可以以myObject.myBool的形式访问它们,依此类推。

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

编译器抱怨变量在@interface块中,所以请将它们从块中移出,要么在>@interface[/code>上方,要么在@end下方。实际上,您可能希望在头中将它们更改为<code>extern</code>s,并在.m文件中声明它们。

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

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





相关问题
List Contents of Directory in a UITableView

I am trying to list the contents of Ringtones directory in a TableView, however, I am only getting the last file in the directory in ALL cells, instead of file per cell. This is my code: - (...

iPhone NSUserDefaults persistance difficulty

In my app i have a bunch of data i store in the NSUserdefaults. This information consists of an NSObject (Object1) with NSStrings and NSNumbers and also 2 instances of yet another object (Object2). ...

Writing a masked image to disk as a PNG file

Basically I m downloading images off of a webserver and then caching them to the disk, but before I do so I want to mask them. I m using the masking code everyone seems to point at which can be found ...

Resize UIImage with aspect ratio?

I m using this code to resize an image on the iPhone: CGRect screenRect = CGRectMake(0, 0, 320.0, 480.0); UIGraphicsBeginImageContext(screenRect.size); [value drawInRect:screenRect blendMode:...

Allowing interaction with a UIView under another UIView

Is there a simple way of allowing interaction with a button in a UIView that lies under another UIView - where there are no actual objects from the top UIView on top of the button? For instance, ...

热门标签