In meiner iOS5-App habe ich die Klasse NSObject
States
und versuche, sie zu initiieren:
states = [states init];
hier ist die init
Methode in States
:
- (id) init
{
if ((self = [super init]))
{
pickedGlasses = 0;
}
return self;
}
Aber es gibt einen Fehler in der Zeile states = [states init];
empfängertyp "States" zum Beispiel Nachricht ist eine Vorwärtsdeklaration
Was heißt das? Was mache ich falsch?
Das bedeutet im Grunde, dass Sie die .h-Datei mit der Zustandserklärung importieren müssen.
Es gibt jedoch eine Menge anderer Dinge, die mit Ihrem Code nicht in Ordnung sind.
+alloc
. Das geht nicht[super init]
Nicht in -init
Auf.@class
Im Header deklariert, die Klasse jedoch nie importiert.FWIW, ich habe diesen Fehler erhalten, als ich Kerndaten in ein vorhandenes Projekt implementiert habe. Es stellte sich heraus, dass ich vergessen hatte, CoreData.h mit meinem Projekt zu verknüpfen. Ich hatte meinem Projekt bereits das CoreData-Framework hinzugefügt, löste das Problem jedoch, indem ich wie in Apples Vorlagen auf das Framework in meinem vorkompilierten Header verweise:
#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
Ich habe diese Art von Nachricht erhalten, als ich zwei Dateien hatte, die voneinander abhängig waren. Das Schwierige dabei ist, dass Sie einen Zirkelverweis erhalten, wenn Sie nur versuchen, sich gegenseitig zu importieren (Klasse A importiert Klasse B, Klasse B importiert Klasse A). Sie würden also stattdessen einen Forward setzen (@class A
) Deklaration in einer der Header-Dateien der Klasse (Klasse B). Wenn jedoch versucht wird, einen Ivar der Klasse A in der Implementierung der Klasse B zu verwenden, tritt genau dieser Fehler auf, indem lediglich ein #import "A.h"
in der .m-Datei der Klasse B hat das Problem für mich behoben.
Für mich habe ich @class "Myclass.h" benutzt
Als ich zu #import "Myclass.h" gewechselt bin
es hat gut funktioniert.
Du benutzt
States states;
wo solltest du verwenden
States *states;
Ihre Init-Methode sollte so aussehen
-(id)init {
if( (self = [super init]) ) {
pickedGlasses = 0;
}
return self;
}
Wenn Sie nun ein Objekt für die States-Klasse erstellen möchten, sollten Sie dies wie folgt tun.
State *states = [[States alloc] init];
Ich sage nicht, dass dies der beste Weg ist, dies zu tun. Es kann Ihnen jedoch dabei helfen, die grundlegende Verwendung der Initialisierung von Objekten zu verstehen.
Überprüfen Sie, ob Sie die Header-Dateien von Klassen importiert haben, die diesen Fehler auslösen.
Stellen Sie sicher, dass sich der Prototyp für Ihre Einheitenmethode in der .h-Datei befindet.
Da Sie die Methode höher in der Datei aufrufen, als Sie sie definieren, wird diese Meldung angezeigt. Alternativ können Sie Ihre Methoden neu anordnen, sodass die Aufrufer in der Datei niedriger sind als die von ihnen aufgerufenen Methoden.
Es gibt zwei verwandte Fehlermeldungen, die möglicherweise darauf hinweisen, dass mit Deklarationen und/oder Importen etwas nicht stimmt.
Das erste ist das, auf das Sie sich beziehen. Dies kann generiert werden, indem Sie in Ihrer .m- (oder .pch-) Datei NICHT einen #import einfügen und in Ihrer .h-Datei eine @-Klasse deklarieren.
Die Sekunde, die Sie vielleicht sehen, wenn Sie eine Methode in Ihrer States-Klasse hatten, wie:
- (void)logout:(NSTimer *)timer
nach dem Hinzufügen des Imports ist dies:
Kein sichtbares @Interface für "States" deklariert den Selektor 'logout:'
Wenn Sie dies sehen, müssen Sie überprüfen, ob Sie Ihre "Abmeldemethode" (in diesem Fall) in der .h-Datei der Klasse deklariert haben, die Sie importieren oder weiterleiten.
In Ihrem Fall benötigen Sie also Folgendes:
- (void)logout:(NSTimer *)timer;
in der Klasse .h Ihrer Bundesstaaten, um einen oder beide dieser Fehler verschwinden zu lassen.