web-dev-qa-db-fra.com

type de destinataire *** par exemple, le message est une déclaration avant

Dans mon application iOS5, j'ai la classe NSObjectStates et je tente de l'initialiser:

states = [states init];

voici la méthode init dans States:

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

    return self;
}

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

type de destinataire "Etats" par exemple, le message est une déclaration aval

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

194
SentineL

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

Cependant, il y a un lot d'autres problèmes avec votre code.

  • Vous êtes en train de créer un objet sans +alloc 'l'ignorer. Ça ne marchera pas
  • Vous déclarez un objet comme un type non-pointeur, cela ne fonctionnera pas non plus
  • Vous n'appelez pas [super init] dans -init.
  • Vous avez déclaré la classe en utilisant @class dans l'en-tête, mais vous n'avez jamais importé la classe.
430
Catfish_Man

FWIW, cette erreur s’est produite lors de l’implémentation des données de base dans un projet existant. En fait, 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é, à l'instar des 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
27
capikaw

J'ai reçu ce genre de message quand j'avais deux fichiers qui dépendaient l'un de l'autre. La difficulté réside dans le fait 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. Vous feriez donc plutôt placer une déclaration forward (@class A) dans l'un des fichiers d'en-tête de la classe (classe B). Cependant, lors de la tentative d'utilisation d'un ivar de classe A dans l'implémentation de la classe B, cette erreur même se produit, le simple ajout d'un #import "A.h" dans le fichier .m de la classe B a résolu le problème pour moi.

23
Stunner

Pour moi, j'utilisais @class "Myclass.h"

Quand j'ai changé pour #import "Myclass.h"

cela a bien fonctionné.

16
Suraj K Thomas

Vous utilisez

States states;

où comme vous devriez utiliser

States *states;

Votre méthode init devrait être comme ça

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

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

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

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

6
Arslan

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

3
nemesis

Assurez-vous que le prototype de votre méthode d'unité est dans le fichier .h.

Comme 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.

1
Fletch

Deux messages d'erreur liés 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 un #import dans votre fichier .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 ceci:

Aucun @interface visible pour "Etats" déclare le sélecteur 'logout:'

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

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

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

dans votre classe Etats .h pour faire disparaître l’une ou l’autre de ces erreurs liées.

0
whyoz