Dans mon application iOS5, j'ai la classe NSObject
States
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?
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.
+alloc
'l'ignorer. Ça ne marchera pas[super init]
dans -init
.@class
dans l'en-tête, mais vous n'avez jamais importé la classe.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
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.
Pour moi, j'utilisais @class "Myclass.h"
Quand j'ai changé pour #import "Myclass.h"
cela a bien fonctionné.
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.
Vérifiez si vous avez importé les fichiers d'en-tête des classes générant cette erreur.
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.
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.