In meiner iOS5-App habe ich NSObject
States
Klasse und versuche, sie zu initiieren :
states = [states init];
Hier ist init
Methode in States
:
- (id) init
{
if ((self = [super init]))
{
pickedGlasses = 0;
}
return self;
}
Aber es gibt einen Fehler in der Leitung states = [states init];
Der Empfängertyp "Zustände" zum Beispiel ist eine Vorwärtsdeklaration
Was heißt das? Was mache ich falsch?
iphone
ios
objective-c
forward-declaration
Wächter
quelle
quelle
Antworten:
Das bedeutet im Grunde, dass Sie die .h-Datei mit der Deklaration der Staaten importieren müssen.
Es gibt jedoch viele andere Probleme mit Ihrem Code.
+alloc
es zu bearbeiten . Das wird nicht funktionieren[super init]
an-init
.@class
im Header mit deklariert, die Klasse jedoch nie importiert.quelle
.h
Datei aufgrund eines Zirkelverweisproblems gerade entfernt hatte .NSObject
.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 das CoreData-Framework bereits zu meinem Projekt hinzugefügt, das Problem jedoch durch Verknüpfen mit dem Framework in meinem vorkompilierten Header gelöst, genau wie es Apples Vorlagen tun:
quelle
Ich bekam diese Art von Nachricht, als ich zwei Dateien hatte, die voneinander abhingen. Das Schwierige dabei ist, dass Sie einen Zirkelverweis erhalten, wenn Sie nur versuchen, sich gegenseitig (Klasse A importiert Klasse B, Klasse B importiert Klasse A) aus ihren Header-Dateien zu importieren. Sie würden also stattdessen eine forward (
@class A
) - Deklaration in eine der Header-Dateien der Klassen (Klasse B) einfügen. Wenn ich jedoch versuche, ein ivar der Klasse A in der Implementierung der Klasse B zu verwenden, tritt genau dieser Fehler auf. Durch#import "A.h"
einfaches Hinzufügen eines in der .m-Datei der Klasse B wurde das Problem für mich behoben.quelle
Ich habe versucht zu benutzen
@class "Myclass.h"
.Als ich es geändert habe,
#import "Myclass.h"
hat es gut funktioniert.quelle
@class "Myclass.h"
ist völlig falsch.@class Myclass
sollte in einer Header-Datei verwendet werden, in die die Klasse nicht importiert werden kann (aufgrund von Zirkelverweisen, wie sie bei einer Swift-definierten Klasse in Objective-C auftreten würden),#import "Myclass.h"
sollte jedoch verwendet werden, wenn sie importiert werden kann.Du benutzt
wo wie du verwenden solltest
Ihre Init-Methode sollte so sein
Wenn Sie nun endlich ein Objekt für die States-Klasse erstellen möchten, sollten Sie dies folgendermaßen tun.
Ich sage nicht, dass dies der beste Weg ist, dies zu tun. Es kann Ihnen jedoch helfen, die grundlegende Verwendung der Initialisierung von Objekten zu verstehen.
quelle
Wenn Sie diesen Fehler erhalten, während Sie versuchen, die Swift-Klasse oder -Methode in Ziel C zu verwenden : Sie haben einen von zwei Schritten vergessen, die Apple in diesem Diagramm definiert hat:
Beispiel:
In Ihrer
Test.m
Datei wird ein Fehler angezeigt:Schritt 1: Prüfung , die
Test.h
hatSchritt 2: Suchen Sie den
*-Swift.h
Dateinamen in den Build-Einstellungen (suchen Sie nach dem Header-Namen der von Objective-C generierten Schnittstelle ). Name wird so etwas wie seinMyModule-Swift.h
Schritt 3: Überprüfen Sie, ob
Test.m
der obige Header importiert wirdquelle
Überprüfen Sie, ob Sie die Header-Dateien von Klassen importiert haben, die diesen Fehler auslösen.
quelle
Stellen Sie sicher, dass sich der Prototyp für Ihre Unit-Methode in der .h-Datei befindet.
Da Sie die Methode in der Datei höher aufrufen als sie definieren, wird diese Meldung angezeigt. Alternativ können Sie Ihre Methoden neu anordnen, sodass die Anzahl der Aufrufer in der Datei niedriger ist als die von ihnen aufgerufenen Methoden.
quelle
Es gibt zwei verwandte Fehlermeldungen, die Ihnen möglicherweise mitteilen, dass mit Deklarationen und / oder Importen etwas nicht stimmt.
Die erste ist die, auf die Sie sich beziehen. Sie kann generiert werden, indem Sie KEINEN #import in Ihre .m- (oder .pch-Datei) einfügen, während Sie eine @class in Ihrer .h-Datei deklarieren.
Die Sekunde, die Sie vielleicht sehen, wenn Sie eine Methode in Ihrer States-Klasse hatten, wie:
Nach dem Hinzufügen des #import ist dies:
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:
in der .h-Klasse Ihrer Staaten, um einen oder beide dieser verwandten Fehler verschwinden zu lassen.
quelle