tipo de receptor ***, por exemplo, mensagem é uma declaração de encaminhamento


199

No meu aplicativo iOS5, tenho NSObject Statesclasse e estou tentando iniciá-lo:

states = [states init];

aqui está o initmétodo em States:

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

    return self;
}

Mas há erro na linha states = [states init];

tipo de receptor "Estados", por exemplo, mensagem é uma declaração de encaminhamento

O que isso significa? O que estou fazendo de errado?


Tentei fazer a mesma pergunta, mas há uma solução diferente em cada uma delas. Estou um pouco confuso
SentineL

3
A resposta muito curta é que você está perdendo uma #import (talvez no seu arquivo Prefix) ou um "@class Abc;" (arquivo ou seja, em um .h logo acima da linha @ interface) linha
Fattie

Respostas:


440

Isso significa basicamente que você precisa importar o arquivo .h que contém a declaração de Estados.

No entanto, há muitas outras coisas erradas no seu código.

  • Você está inserindo um objeto sem +allocele. Isso não vai funcionar
  • Você está declarando um objeto como um tipo sem ponteiro, que também não funcionará
  • Você não está chamando [super init]no -init.
  • Você declarou a classe usando @classno cabeçalho, mas nunca importou a classe.

Isso é um pouco estranho, já que no meu caso eu tinha acabado de remover o .harquivo por causa de um problema de referência circular.
Alper

Que redação absolutamente ridícula. Mas sim, isso consertou.
precisa saber é o seguinte

Se você estiver tentando usar objetos Swift no Objective-C, não esqueça que eles precisam herdar NSObject.
Michal Šrůtek em 20/02

27

FWIW, recebi esse erro quando estava implementando dados principais em um projeto existente. Acabei esquecendo de vincular CoreData.h ao meu projeto. Eu já havia adicionado a estrutura CoreData ao meu projeto, mas resolvi o problema vinculando-a à estrutura no meu cabeçalho pré-compilado, assim como os modelos da 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
Que pena que quase todo o tutorial CoreData comece com o modelo, mas não com um projeto existente. É muito fácil cometer erros aqui.
Yeung

24

Recebi esse tipo de mensagem quando tinha dois arquivos que dependiam um do outro. O mais complicado aqui é que você obterá uma referência circular se apenas tentar importar um ao outro (classe A importa classe B, classe B importa classe A) de seus arquivos de cabeçalho. Então, o que você faria é colocar uma @class Adeclaração forward ( ) em um dos arquivos de cabeçalho das classes (classes B). No entanto, ao tentar usar um ivar da classe A na implementação da classe B, esse mesmo erro surge, apenas adicionando um #import "A.h"no arquivo .m da classe B corrigiu o problema para mim.


16

Eu estava tentando usar @class "Myclass.h".

Quando mudei para #import "Myclass.h", funcionou bem.


Apenas uma nota lateral aqui: @class "Myclass.h"está completamente incorreta. @class Myclassdeve ser usado em um arquivo de cabeçalho em que a classe não pode ser importada (devido à referência circular, como ocorreria com uma classe definida por Swift no Objective-C), mas #import "Myclass.h"deve ser usada se puder ser importada.
Usuário que não é usuário

6

Você está usando

States states;

onde você deve usar

States *states;

Seu método init deve ser assim

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

Agora, finalmente, quando você criar um objeto para a classe States, faça-o assim.

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

Não estou dizendo que essa é a melhor maneira de fazer isso. Mas isso pode ajudá-lo a entender o uso muito básico de inicializar objetos.


5

Se você estiver recebendo esse erro ao tentar usar a classe ou o método Swift no Objetivo C : esqueceu uma das 2 etapas definidas pela Apple neste diagrama:

insira a descrição da imagem aqui

Exemplo:

O erro aparece no seu Test.marquivo:

O receptor 'MyClass' para a mensagem da classe é uma declaração de encaminhamento

Etapa 1: verifique se Test.h

@class MyClass;

Etapa 2: encontre *-Swift.ho nome do arquivo em Configurações de compilação (procure pelo Nome do cabeçalho da interface gerada pelo Objective-C ). Nome será algo comoMyModule-Swift.h

Etapa 3: verifique se Test.mimporta o cabeçalho acima

#import "MyModule-Swift.h"

3

Verifique se você importou os arquivos de cabeçalho das classes que estão lançando esse erro.


1

Verifique se o protótipo para o método da sua unidade está no arquivo .h.

Como você está chamando o método mais alto no arquivo do que o definido, você recebe esta mensagem. Como alternativa, você pode reorganizar seus métodos, para que os chamadores sejam mais baixos no arquivo do que os métodos que chamam.


0

Há duas mensagens de erro relacionadas que podem indicar que algo está errado com as declarações e / ou importações.

O primeiro é aquele a que você está se referindo, que pode ser gerado NÃO colocando uma # importação no seu arquivo .m (ou .pch) ao declarar uma classe @ no seu .h.

O segundo você pode ver, se você tivesse um método em sua classe States como:

- (void)logout:(NSTimer *)timer

depois de adicionar o #import é o seguinte:

Nenhum @interface visível para "Estados" declara o seletor 'logout:'

Se você vir isso, verifique se declarou o método "logout" (neste caso) no arquivo .h da classe que está importando ou encaminhando.

Portanto, no seu caso, você precisaria de:

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

nas classes .h da sua classe de Estados para fazer com que um ou ambos esses erros relacionados desapareçam.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.