在我的iOS5应用中,我有NSObject
States
类,并尝试初始化它:
states = [states init];
这是init
中的States
方法:
- (id) init
{
if ((self = [super init]))
{
pickedGlasses = 0;
}
return self;
}
但是行states = [states init];
接收者类型“States”例如消息是前向声明
这是什么意思?我做错了什么?
答案 0 :(得分:428)
这基本上意味着您需要导入包含States声明的.h文件。
但是,您的代码中存在其他错误的批次。
+alloc
的情况下进行对象的。这不会起作用[super init]
中致电-init
。@class
声明了该类,但从未导入该类。答案 1 :(得分:27)
FWIW,我在将核心数据实施到现有项目时遇到了这个错误。事实证明我忘了将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
答案 2 :(得分:23)
当我有两个相互依赖的文件时,我得到了这种消息。这里很棘手的是,如果你只是尝试从它们的头文件中互相导入(A类导入B类,B类导入A类),那么你将获得循环引用。所以你要做的是在一个类(B类)头文件中放置一个前向(@class A
)声明。但是,当尝试在B类的实现中使用类A的ivar时,会出现这个错误,只是在B类的.m文件中添加#import "A.h"
为我解决了这个问题。
答案 3 :(得分:15)
对我来说,我使用的是@class“Myclass.h”
当我改为#import“Myclass.h”
时它运作良好。
答案 4 :(得分:7)
如果在尝试在目标C中使用Swift类或方法时遇到此错误:您忘记了苹果在此图中定义的2个步骤之一:
示例:
错误显示在您的Test.m
文件中:
类消息的接收者“ MyClass”是一个前向声明
步骤1:检查Test.h
是否具有
@class MyClass;
第2步:在 Build Settings 中找到*-Swift.h
文件名(查找 Objective-C生成的接口头名称 )。名称将类似于MyModule-Swift.h
第3步:检查Test.m
是否导入了上述标头
#import "MyModule-Swift.h"
答案 5 :(得分:5)
您正在使用
States states;
你应该在哪里使用
States *states;
你的init方法应该是这样的
-(id)init {
if( (self = [super init]) ) {
pickedGlasses = 0;
}
return self;
}
现在最后当你要为States类创建一个对象时,你应该这样做。
State *states = [[States alloc] init];
我并不是说这是最好的方法。但它可以帮助您理解初始化对象的基本用法。
答案 6 :(得分:3)
检查是否导入了抛出此错误的类的头文件。
答案 7 :(得分:1)
确保您的单位方法的原型位于.h文件中。
因为您在文件中调用的方法比您定义的方法更高,所以您会收到此消息。或者,您可以重新排列方法,以便调用者在文件中的位置低于他们调用的方法。
答案 8 :(得分:0)
有两条相关的错误消息可能会告诉您声明和/或导入有问题。
第一个是你所指的那个,可以通过在你的.h中声明一个@class时不在你的.m(或.pch文件)中放一个#import来生成。
你可能会看到第二个,如果你的州级中有一个方法,如:
- (void)logout:(NSTimer *)timer
添加#import后是:
“States”的可见@interface没有声明选择器'logout:'
如果您看到这一点,则需要检查并查看是否在要导入或转发的类的.h文件中声明了“logout”方法(在本例中)。
所以在你的情况下,你需要一个:
- (void)logout:(NSTimer *)timer;
在您所在国家/地区的.h中,以使这些相关错误中的一个或两个消失。