接收者类型***例如消息是转发声明


199

在我的iOS5应用中,我有NSObject States课,然后尝试初始化它:

states = [states init];

这是init方法States

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

    return self;
}

但是行中有错误 states = [states init];

例如,消息的接收方类型“状态”为前向声明

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


我试图解决相同的问题,但是每个tham中都有不同的解决方案。我有点困惑
SentineL

3
简短的答案是您或者缺少#import(也许在Prefix文件中),或者您缺少了“ @class Abc;”。行(即,位于@interface行上方的.h文件中)
Fattie 2014年

Answers:


440

这基本上意味着您需要导入包含状态声明的.h文件。

但是,您的代码还有很多其他问题。

  • 您正在-初始化对象而未+alloc对其进行操作。那行不通
  • 您正在将对象声明为非指针类型,该对象也不起作用
  • 你不是要求[super init]-init
  • 您已经@class在标头中使用声明了该类,但从未导入该类。

但是,这有点奇怪,因为就我而言,.h由于循环引用问题,我只是删除了该文件。
Alper

多么荒谬的措辞。但是,是的,它固定了它。
TimJowers2 '18 / 08/21

如果您尝试在Objective-C中使用Swift对象,请不要忘记它们必须继承自NSObject
MichalŠrůtek

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
几乎所有的CoreData教程都开始使用模板而不使用现有项目,这真是令人遗憾。在这里容易出错。

24

当我有两个相互依赖的文件时,我得到了这种消息。棘手的是,如果您只是尝试从其头文件中相互导入(类A导入类B,类B导入类A),则将获得循环引用。因此,您要做的是改为@class A在类(B类)的头文件之一中放置一个forward()声明。但是,当尝试在类B的实现中使用类A的ivar时,会出现此错误,仅#import "A.h"在类B的.m文件中添加一个对我来说解决了问题。


16

我正在尝试使用 @class "Myclass.h"

当我将其更改为时#import "Myclass.h",它工作正常。


这里只是一个旁注:@class "Myclass.h"完全不正确。@class Myclass应该在无法导入该类的头文件中使用(由于循环引用,例如,Objective-C中的Swift定义的类会发生这种情况),但#import "Myclass.h"如果可以导入,则应使用它。
不是用户的用户

6

您正在使用

States states;

应该在哪里使用

States *states;

您的init方法应该是这样的

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

现在最后,当您要为States类创建对象时,您应该这样做。

State *states = [[States alloc] init];

我并不是说这是最好的方法。但这可以帮助您了解初始化对象的最基本用法。


5

如果在尝试在Objective C中使用Swift类或方法时遇到此错误:您忘记了Apple在此图中定义的2个步骤之一:

在此处输入图片说明

例:

错误出现在您的Test.m文件中:

类消息的接收方“ MyClass”是前向声明

步骤1:检查是否Test.h

@class MyClass;

步骤2:*-Swift.h在“ 构建设置”中找到文件名(查找“ Objective-C生成的接口头名称”)。名字会像MyModule-Swift.h

步骤3:检查是否Test.m导入了上述标头

#import "MyModule-Swift.h"

3

检查是否导入了引发此错误的类的头文件。


1

确保您的unit方法的原型位于.h文件中。

因为您在文件中调用的方法比定义的要高,所以您会收到此消息。或者,您可以重新排列方法,以使调用者在文件中的位置比调用者的方法低。


0

有两个相关的错误消息,可能会告诉您声明和/或导入有问题。

第一个是您要引用的,可以通过在.h中声明@class时不将#import放入.m(或.pch文件)中来生成。

如果您在States类中有一个类似下面的方法,则可能会看到第二个:

- (void)logout:(NSTimer *)timer

添加#import之后是这样的:

对于“状态”,没有可见的@interface声明选择器“注销”:

如果看到此消息,则需要检查并查看是否在要导入或转发的类的.h文件中声明了“注销”方法(在这种情况下)。

因此,在您的情况下,您需要:

- (void)logout:(NSTimer *)timer;

在您所在州的.h文件中删除这些相关错误中的一个或两个。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.