tipo de receptor ***, por ejemplo, el mensaje es una declaración de reenvío

199

En mi aplicación iOS5, tengo NSObject Statesclase e intento iniciarla:

states = [states init];

Aquí hay un initmétodo en States:

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

    return self;
}

Pero hay un error en la línea. states = [states init];

tipo de receptor "Estados", por ejemplo, el mensaje es una declaración de reenvío

Qué significa eso? ¿Qué estoy haciendo mal?

Centinela
fuente
Traté de contestar la misma pregunta, pero hay una solución diferente en cada uno de ellos. Estoy un poco confundido
SentineL
3
La respuesta muy breve es que le falta una #importación (quizás en su archivo de Prefijos) o le falta una "@class Abc;" línea (es decir, en un archivo .h justo encima de la línea @interface)
Fattie

Respuestas:

440

Eso básicamente significa que necesita importar el archivo .h que contiene la declaración de Estados.

Sin embargo, hay muchas otras cosas mal con su código.

  • Estás -iniciando un objeto sin +alloctenerlo. Eso no va a funcionar
  • Está declarando un objeto como un tipo sin puntero, que tampoco funcionará
  • Usted no está llamando [super init]en -init.
  • Has declarado la clase usando @classel encabezado, pero nunca importaste la clase.
Catfish_Man
fuente
Sin embargo, esto es un poco extraño ya que en mi caso acababa de eliminar el .harchivo debido a un problema de referencia circular.
Alper
Qué redacción absolutamente ridícula. Pero, sí, eso lo arregló.
TimJowers2
Si está tratando de usar objetos Swift en Objective-C, no olvide que tienen que heredar NSObject.
Michal Šrůtek
27

FWIW, recibí este error cuando estaba implementando datos básicos en un proyecto existente. Resultó que olvidé vincular CoreData.h a mi proyecto. Ya había agregado el marco CoreData a mi proyecto, pero resolví el problema al vincularlo al marco en mi encabezado precompilado al igual que las plantillas de 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
capikaw
fuente
2
Qué pena que casi todo el tutorial de CoreData comience con el uso de la plantilla pero no con un proyecto existente. Es bastante fácil equivocarse aquí.
Yeung
24

Recibí este tipo de mensaje cuando tenía dos archivos que dependían el uno del otro. Lo complicado aquí es que obtendrá una referencia circular si solo trata de importarse entre sí (la clase A importa la clase B, la clase B importa la clase A) desde sus archivos de encabezado. Entonces, lo que haría es colocar una @class Adeclaración forward ( ) en el archivo de encabezado de una de las clases (clase B). Sin embargo, cuando intento usar un ivar de clase A dentro de la implementación de la clase B, aparece este mismo error, simplemente agregar un #import "A.h"en el archivo .m de la clase B me solucionó el problema.

Persona maravillosa
fuente
16

Yo estaba tratando de usar @class "Myclass.h".

Cuando lo cambié a #import "Myclass.h", funcionó bien.

Suraj K Thomas
fuente
Solo una nota al margen aquí: @class "Myclass.h"es completamente incorrecta. @class Myclassdebe usarse en un archivo de encabezado donde la clase no puede importarse (debido a referencias circulares, como ocurriría con una clase definida por Swift en Objective-C) pero #import "Myclass.h"debe usarse si puede importarse.
Usuario que no es usuario
6

Tu estas usando

States states;

donde como deberías usar

States *states;

Tu método init debería ser así

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

Ahora, finalmente, cuando va a crear un objeto para la clase de Estados, debe hacerlo así.

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

No digo que esta sea la mejor forma de hacerlo. Pero puede ayudarlo a comprender el uso muy básico de inicializar objetos.

Arslan
fuente
5

Si recibe este error al intentar utilizar la clase o método Swift en el Objetivo C : olvidó uno de los 2 pasos que Apple definió en este diagrama:

ingrese la descripción de la imagen aquí

Ejemplo:

El error aparece en su Test.marchivo:

El receptor 'MyClass' para el mensaje de clase es una declaración de reenvío

Paso 1: compruebe que Test.htiene

@class MyClass;

Paso 2: busque *-Swift.hel nombre del archivo en Configuración de compilación (busque el Nombre del encabezado de la interfaz generada por Objective-C ). El nombre será algo comoMyModule-Swift.h

Paso 3: comprueba que Test.mimporta el encabezado anterior

#import "MyModule-Swift.h"
Kiril S.
fuente
3

Compruebe si importó los archivos de encabezado de las clases que arrojan este error.

justicia
fuente
1

Asegúrese de que el prototipo para el método de su unidad esté en el archivo .h.

Como está llamando al método más alto en el archivo de lo que lo está definiendo, recibe este mensaje. Alternativamente, puede reorganizar sus métodos, de modo que las personas que llaman sean más bajas en el archivo que los métodos que llaman.

Fletch
fuente
0

Hay dos mensajes de error relacionados que pueden indicarle que algo está mal con las declaraciones y / o importaciones.

El primero es al que se refiere, que puede generarse al NO poner una #importación en su .m (o archivo .pch) mientras declara una @clase en su .h.

El segundo que puede ver, si tuviera un método en su clase de Estados como:

- (void)logout:(NSTimer *)timer

después de agregar #import es esto:

Ninguna interfaz @ visible para "Estados" declara el selector 'cerrar sesión:'

Si ve esto, debe verificar y ver si declaró su método de "cierre de sesión" (en este caso) en el archivo .h de la clase que está importando o reenviando.

Entonces, en su caso, necesitaría un:

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

en la clase .h de su estado para hacer que uno o ambos errores relacionados desaparezcan.

whyoz
fuente