webentwicklung-frage-antwort-db.com.de

empfängertyp *** zum beispiel nachricht ist eine vorwärtsdeklaration

In meiner iOS5-App habe ich die Klasse NSObjectStates 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?

194
SentineL

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.

  • Sie starten ein Objekt, ohne es zu +alloc. Das geht nicht
  • Sie deklarieren ein Objekt als Nichtzeigertyp, was auch nicht funktioniert
  • Sie rufen [super init] Nicht in -init Auf.
  • Sie haben die Klasse mit @class Im Header deklariert, die Klasse jedoch nie importiert.
430
Catfish_Man

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
27
capikaw

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.

23
Stunner

Für mich habe ich @class "Myclass.h" benutzt

Als ich zu #import "Myclass.h" gewechselt bin

es hat gut funktioniert.

16
Suraj K Thomas

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.

6
Arslan

Überprüfen Sie, ob Sie die Header-Dateien von Klassen importiert haben, die diesen Fehler auslösen.

3
nemesis

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.

1
Fletch

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.

0
whyoz