接收器类型***例如消息是前向声明

时间:2012-01-11 06:43:08

标签: iphone ios objective-c forward-declaration

在我的iOS5应用中,我有NSObject States类,并尝试初始化它:

states = [states init];

这是init中的States方法:

- (id) init
{
    if ((self = [super init]))
    {
        pickedGlasses = 0;
    }

    return self;
}

但是行states = [states init];

中有错误
  

接收者类型“States”例如消息是前向声明

这是什么意思?我做错了什么?

9 个答案:

答案 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个步骤之一:

enter image description here

示例:

错误显示在您的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中,以使这些相关错误中的一个或两个消失。