Der Empfängertyp *** zum Beispiel ist eine Vorwärtsdeklaration

199

In meiner iOS5-App habe ich NSObject StatesKlasse und versuche, sie zu initiieren :

states = [states init];

Hier ist initMethode 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?

Wächter
quelle
Ich habe versucht, die gleiche Frage zu beantworten, aber es gibt in jedem von ihnen eine andere Lösung. Ich bin ein wenig verwirrt
SentineL
3
Die sehr kurze Antwort lautet, dass Ihnen entweder ein #import (möglicherweise in Ihrer Präfixdatei) oder ein "@class Abc;" fehlt. Zeile (dh in einer .h-Datei direkt über der @ Interface-Zeile)
Fattie

Antworten:

440

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.

  • Sie starten ein Objekt, ohne +alloces zu bearbeiten . Das wird nicht funktionieren
  • Sie deklarieren ein Objekt als Nicht-Zeigertyp, was auch nicht funktioniert
  • Du rufst nicht [super init]an -init.
  • Sie haben die Klasse @classim Header mit deklariert, die Klasse jedoch nie importiert.
Catfish_Man
quelle
Dies ist allerdings etwas seltsam, da ich in meinem Fall die .hDatei aufgrund eines Zirkelverweisproblems gerade entfernt hatte .
Alper
Was für eine absolut lächerliche Formulierung. Aber ja, das hat es behoben.
TimJowers2
Wenn Sie versuchen, Swift-Objekte in Objective-C zu verwenden, vergessen Sie nicht, dass sie von ihnen erben müssen NSObject.
Michal Šrůtek
27

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:

#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
Capikaw
quelle
2
Was für eine Schande, dass fast alle CoreData-Lernprogramme mit der Verwendung der Vorlage beginnen, jedoch nicht mit einem vorhandenen Projekt. Es ist ziemlich leicht, hier Fehler zu machen.
Yeung
24

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.

Stunner
quelle
16

Ich habe versucht zu benutzen @class "Myclass.h".

Als ich es geändert habe, #import "Myclass.h"hat es gut funktioniert.

Suraj K Thomas
quelle
Nur eine Randnotiz hier: @class "Myclass.h"ist völlig falsch. @class Myclasssollte 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.
Benutzer, der kein Benutzer ist
6

Du benutzt

States states;

wo wie du verwenden solltest

States *states;

Ihre Init-Methode sollte so sein

-(id)init {
  if( (self = [super init]) ) {
      pickedGlasses = 0;
  }
  return self;
}

Wenn Sie nun endlich ein Objekt für die States-Klasse erstellen möchten, sollten Sie dies folgendermaßen tun.

State *states = [[States alloc] init];

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.

Arslan
quelle
5

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:

Geben Sie hier die Bildbeschreibung ein

Beispiel:

In Ihrer Test.mDatei wird ein Fehler angezeigt:

Der Empfänger 'MyClass' für Klassennachrichten ist eine Weiterleitungsdeklaration

Schritt 1: Prüfung , die Test.hhat

@class MyClass;

Schritt 2: Suchen Sie den *-Swift.hDateinamen 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.mder obige Header importiert wird

#import "MyModule-Swift.h"
Kiril S.
quelle
3

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

Nemesis
quelle
1

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.

Befiedern
quelle
0

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:

- (void)logout:(NSTimer *)timer

Nach dem Hinzufügen des #import ist dies:

Keine sichtbare @ Schnittstelle 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 .h-Klasse Ihrer Staaten, um einen oder beide dieser verwandten Fehler verschwinden zu lassen.

Whyoz
quelle