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

Sen*_*neL 197 iphone objective-c forward-declaration ios

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

states = [states init];
Run Code Online (Sandbox Code Playgroud)

这里的init方法是States:

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

    return self;
}
Run Code Online (Sandbox Code Playgroud)

但是线路上有错误 states = [states init];

接收器类型"States"例如message是一个前向声明

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

Cat*_*Man 434

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

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

  • 你不是在没有+alloc它就是一个物体.那不行
  • 您将对象声明为非指针类型,这也不起作用
  • 你不是[super init]在打电话-init.
  • 您已@class在标头中声明了类,但从未导入该类.

  • 如果您尝试在 Objective-C 中使用 Swift 对象,请不要忘记它们必须继承自“NSObject”。 (3认同)

cap*_*kaw 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
Run Code Online (Sandbox Code Playgroud)

  • 几乎所有CoreData教程都开始使用模板而不是现有项目,这真是太遗憾了.在这里犯错是很容易的. (2认同)

Stu*_*ner 23

当我有两个相互依赖的文件时,我收到了这种消息.这里很棘手的是,如果你只是尝试从它们的头文件中互相导入(A类导入B类,B类导入A类),那么你将获得循环引用.那么你要做的是@class A在一个类(B类)头文件中放置一个forward()声明.但是,当尝试在B类的实现中使用类A的ivar时,出现了这个错误,只是#import "A.h"在B类的.m文件中添加一个修复了我的问题.


Sur*_*mas 16

对我来说,我使用@class"Myclass.h"

当我改为#import"Myclass.h"时

它工作得很好.


Kir*_* S. 9

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

在此输入图像描述

例子:

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

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

在 Obj-C 文件中:

第 1 步:检查是否Test.h

@class MyClass;
Run Code Online (Sandbox Code Playgroud)

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

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

#import <MyModule/MyModule-Swift.h>
Run Code Online (Sandbox Code Playgroud)

在 Swift 文件中:

  • 确保MyClass(或其基类)继承NSObject类。
  • 确保@objc位于要从 Obj-C 调用的每个方法之前。
  • 另外,检查目标成员资格部分(在文件检查器中)。


Ars*_*lan 6

您正在使用

States states;
Run Code Online (Sandbox Code Playgroud)

你应该在哪里使用

States *states;
Run Code Online (Sandbox Code Playgroud)

你的init方法应该是这样的

-(id)init {
  if( (self = [super init]) ) {
      pickedGlasses = 0;
  }
  return self;
}
Run Code Online (Sandbox Code Playgroud)

最后,当你要为States类创建一个对象时,你应该这样做.

State *states = [[States alloc] init];
Run Code Online (Sandbox Code Playgroud)

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