le type de récepteur ***, par exemple, le message est une déclaration directe

199

Dans mon application iOS5, j'ai une NSObject Statesclasse et j'essaye de l'initier:

states = [states init];

voici la initméthode en States:

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

    return self;
}

Mais il y a une erreur dans la ligne states = [states init];

le type de récepteur "States", par exemple, le message est une déclaration directe

Qu'est-ce que ça veut dire? Qu'est-ce que je fais mal?

Sentinelle
la source
J'ai essayé de répondre à la même question, mais il y a une solution différente dans chacun d'eux. Je suis un peu
confus
3
La réponse très courte est qu'il vous manque soit un #import (peut-être dans votre fichier Prefix) soit un "@class Abc;" (c'est-à-dire dans un fichier .h juste au-dessus de la ligne @interface)
Fattie

Réponses:

440

Cela signifie essentiellement que vous devez importer le fichier .h contenant la déclaration des États.

Cependant, il y a beaucoup d'autres choses qui ne vont pas avec votre code.

  • Vous -initiez un objet sans +allocle faire. Ça ne marchera pas
  • Vous déclarez un objet comme un type sans pointeur, cela ne fonctionnera pas non plus
  • Vous n'êtes pas appeler [super init]à-init .
  • Vous avez déclaré la classe à l'aide de l' @classen-tête, mais vous n'avez jamais importé la classe.
Catfish_Man
la source
C'est un peu bizarre, car dans mon cas, je venais de supprimer le .hfichier en raison d'un problème de référence circulaire.
Alper
Quelle formulation absolument ridicule. Mais oui, ça l'a réparé.
TimJowers2
Si vous essayez d'utiliser des objets Swift dans Objective-C, n'oubliez pas qu'ils doivent hériter de NSObject.
Michal Šrůtek
27

FWIW, j'ai eu cette erreur lorsque j'implémentais des données de base dans un projet existant. Il s'est avéré que j'ai oublié de lier CoreData.h à mon projet. J'avais déjà ajouté le framework CoreData à mon projet, mais j'ai résolu le problème en créant un lien vers le framework dans mon en-tête précompilé, tout comme les modèles d'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
la source
2
Quel dommage que la quasi-totalité du tutoriel CoreData commence par utiliser le modèle mais pas avec un projet existant. Il est assez facile de se tromper ici.
Yeung
24

J'ai reçu ce genre de message lorsque j'avais deux fichiers qui dépendaient l'un de l'autre. La chose délicate ici est que vous obtiendrez une référence circulaire si vous essayez simplement de vous importer (la classe A importe la classe B, la classe B importe la classe A) à partir de leurs fichiers d'en-tête. Donc, ce que vous feriez serait de placer une @class Adéclaration forward ( ) dans l'un des fichiers d'en-tête des classes (classe B). Cependant, lorsque vous essayez d'utiliser un ivar de classe A dans l'implémentation de la classe B, cette erreur se produit, simplement l'ajout d'un #import "A.h"fichier dans le fichier .m de classe B a résolu le problème pour moi.

Stunner
la source
16

J'essayais d'utiliser @class "Myclass.h".

Quand je l'ai changé #import "Myclass.h", cela a bien fonctionné.

Suraj K Thomas
la source
Juste une petite note ici: @class "Myclass.h"est complètement incorrect. @class Myclassdoit être utilisé dans un fichier d'en-tête où la classe ne peut pas être importée (en raison du référencement circulaire, comme cela se produirait avec une classe définie par Swift dans Objective-C) mais #import "Myclass.h"doit être utilisé s'il peut être importé.
Utilisateur qui n'est pas un utilisateur
6

Vous utilisez

States states;

où vous devez utiliser

States *states;

Votre méthode d'initialisation devrait être comme ceci

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

Enfin, lorsque vous allez créer un objet pour la classe States, vous devez le faire comme ceci.

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

Je ne dis pas que c'est la meilleure façon de procéder. Mais cela peut vous aider à comprendre l'utilisation très basique de l'initialisation d'objets.

Arslan
la source
5

Si vous obtenez cette erreur en essayant d'utiliser la classe ou la méthode Swift dans l'objectif C : vous avez oublié l'une des 2 étapes définies par Apple sur ce diagramme:

entrez la description de l'image ici

Exemple:

Une erreur apparaît dans votre Test.mfichier:

Le récepteur 'MyClass' pour le message de classe est une déclaration directe

Étape 1: vérifier que Test.ha

@class MyClass;

Étape 2: recherchez *-Swift.hle nom du fichier dans les paramètres de construction (recherchez le nom d'en -tête d'interface généré par Objective-C ). Le nom sera quelque chose commeMyModule-Swift.h

Étape 3: vérifiez que l' Test.mimportation de l'en-tête ci-dessus

#import "MyModule-Swift.h"
Kiril S.
la source
3

Vérifiez si vous avez importé les fichiers d'en-tête des classes qui génèrent cette erreur.

Némésis
la source
1

Assurez-vous que le prototype de votre méthode unitaire se trouve dans le fichier .h.

Parce que vous appelez la méthode plus haut dans le fichier que vous ne le définissez, vous obtenez ce message. Vous pouvez également réorganiser vos méthodes afin que les appelants soient plus bas dans le fichier que les méthodes qu'ils appellent.

Fletch
la source
0

Il existe deux messages d'erreur associés qui peuvent vous indiquer que quelque chose ne va pas avec les déclarations et / ou les importations.

Le premier est celui auquel vous faites référence, qui peut être généré en ne mettant pas #import dans votre .m (ou fichier .pch) tout en déclarant une @class dans votre .h.

La seconde que vous pourriez voir, si vous aviez une méthode dans votre classe States comme:

- (void)logout:(NSTimer *)timer

après avoir ajouté le #import est le suivant:

Aucune @interface visible pour "States" déclare le sélecteur 'logout:'

Si vous voyez cela, vous devez vérifier et voir si vous avez déclaré votre méthode de "déconnexion" (dans ce cas) dans le fichier .h de la classe que vous importez ou transférez.

Donc, dans votre cas, vous auriez besoin d'un:

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

dans le .h de votre classe States pour faire disparaître l'une ou les deux de ces erreurs.

pourquoi
la source