接收方types***例如消息是前向声明
在我的iOS5应用程序,我有NSObject
States
类,并试图启动它:
states = [states init];
这里是国家的init
方法:
- (id) init { if ((self = [super init])) { pickedGlasses = 0; } return self; }
但是在行states = [states init];
有错误states = [states init];
接收方types“States”例如消息是一个前向声明
这是什么意思? 我究竟做错了什么?
这基本上意味着你需要导入包含国家声明的.h文件。
但是,你的代码还有很多其他的东西是错误的。
- 你正在启动一个没有
+alloc
的对象。 这是行不通的 - 你声明一个对象是一个非指针types,这也是行不通的
- 你不是在
-init
调用[super init]
。 - 你已经在头文件中使用
@class
声明类,但从来没有导入类。
FWIW,当我将核心数据实现到现有项目时,出现了这个错误。 事实certificate,我忘了将CoreData.h链接到我的项目。 我已经将CoreData框架添加到我的项目中,但通过链接到我的预编译头文件中的框架解决了问题,就像Apple的模板一样:
#import <Availability.h> #ifndef __IPHONE_5_0 #warning "This project uses features only available in iOS SDK 5.0 and later." #endif #ifdef __OBJC__ #import <UIKit/UIKit.h> #import <Foundation/Foundation.h> #import <CoreData/CoreData.h> #endif
当我有两个相互依赖的文件时,我得到了这样的信息。 这里棘手的事情是,如果你只是试着从头文件中导入对方(A类inputB类,B类inputA类),你将得到一个循环引用。 所以你要做的是将一个forward( @class A
)声明放在其中一个类(B类)的头文件中。 然而,在B类实现中尝试使用A类ivar的时候,这个错误就出现了,只是在B类的.m文件中增加一个#import "Ah"
来解决这个问题。
对我来说,我使用@class“Myclass.h”
当我改为#import“Myclass.h”
它工作正常。
您正在使用
States states;
在哪里,你应该使用
States *states;
你的init方法应该是这样的
-(id)init { if( (self = [super init]) ) { pickedGlasses = 0; } return self; }
现在最后,当你要为国家class级创build一个对象时,你应该这样做。
State *states = [[States alloc] init];
我不是说这是做这件事的最好方法。 但是它可以帮助你理解初始化对象的基本用法。
检查是否导入了抛出此错误的类的头文件。
确保单元方法的原型在.h文件中。
因为您在文件中调用的方法比定义方法更高,所以您会收到此消息。 或者,您可以重新排列您的方法,以便调用者在文件中比调用的方法更低。
有两个相关的错误消息可能会告诉你声明和/或导入有问题。
第一个是你指的那个,它可以通过在你的.h(或.pch文件)中放置一个#import来生成,同时在.h中声明一个@class。
第二个你可能会看到,如果你有一个在你的国家类的方法,如:
- (void)logout:(NSTimer *)timer
添加#import后是这样的:
“States”没有可见的@interface声明select器“注销:”
如果您看到这一点,则需要检查并确定是否在要导入或转发的类的.h文件中声明了“注销”方法(在本例中)。
所以在你的情况下,你需要一个:
- (void)logout:(NSTimer *)timer;
在你们国家class的.h中,使这些相关错误中的一个或两个消失。