Dans mon application iOS5, j'ai une NSObject
States
classe et j'essaye de l'initier:
states = [states init];
voici la init
mé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?
iphone
ios
objective-c
forward-declaration
Sentinelle
la source
la source
Réponses:
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.
+alloc
le faire. Ça ne marchera pas[super init]
à-init
.@class
en-tête, mais vous n'avez jamais importé la classe.la source
.h
fichier en raison d'un problème de référence circulaire.NSObject
.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:
la source
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 A
dé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.la source
J'essayais d'utiliser
@class "Myclass.h"
.Quand je l'ai changé
#import "Myclass.h"
, cela a bien fonctionné.la source
@class "Myclass.h"
est complètement incorrect.@class Myclass
doit ê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é.Vous utilisez
où vous devez utiliser
Votre méthode d'initialisation devrait être comme ceci
Enfin, lorsque vous allez créer un objet pour la classe States, vous devez le faire comme ceci.
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.
la source
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:
Exemple:
Une erreur apparaît dans votre
Test.m
fichier:Étape 1: vérifier que
Test.h
aÉtape 2: recherchez
*-Swift.h
le 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.m
importation de l'en-tête ci-dessusla source
Vérifiez si vous avez importé les fichiers d'en-tête des classes qui génèrent cette erreur.
la source
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.
la source
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:
après avoir ajouté le #import est le suivant:
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:
dans le .h de votre classe States pour faire disparaître l'une ou les deux de ces erreurs.
la source