typ odbiornika *** na przykład komunikat jest deklaracją przekazującą

199

W mojej aplikacji na iOS5 mam NSObject Stateszajęcia i próbuję je zainicjować:

states = [states init];

tutaj jest initmetoda w States:

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

    return self;
}

Ale w linii jest błąd states = [states init];

na przykład typ odbiornika „Stany” jest deklaracją przekazującą

Co to znaczy? Co ja robię źle?

Strażnik
źródło
Próbowałem odpowiedzieć na to samo pytanie, ale każde z nich ma inne rozwiązanie. Jestem trochę zdezorientowany
SentineL
3
Bardzo krótka odpowiedź brzmi: brakuje #importu (być może w pliku prefiksu) lub brakuje „@class Abc;” linia (tj. w pliku .h tuż nad linią @interface)
Fattie

Odpowiedzi:

440

Zasadniczo oznacza to, że musisz zaimportować plik .h zawierający deklarację stanów.

W twoim kodzie jest jednak wiele innych błędów.

  • -Oddajesz przedmiot, nie wchodząc w nie +alloc. To nie zadziała
  • Zadeklarujesz obiekt jako typ bez wskaźnika, który też nie zadziała
  • Nie dzwonisz [super init]w-init .
  • Zadeklarowałeś klasę za pomocą @classw nagłówku, ale nigdy nie zaimportowałeś klasy.
Catfish_Man
źródło
Jest to trochę dziwne, ponieważ w moim przypadku właśnie usunąłem .hplik z powodu problemu z cyklicznym odwołaniem.
Alper
Co za absolutnie absurdalne sformułowanie. Ale tak, to naprawiło.
TimJowers2,
Jeśli próbujesz użyć obiektów Swift w Objective-C, nie zapomnij, że muszą dziedziczyć NSObject.
Michal Šrůtek,
27

FWIW, dostałem ten błąd, kiedy wdrażałem podstawowe dane w istniejącym projekcie. Okazało się, że zapomniałem połączyć CoreData.h z moim projektem. Dodałem już szkielet CoreData do mojego projektu, ale rozwiązałem ten problem, łącząc się ze szkieletem w moim wstępnie skompilowanym nagłówku, tak jak robią to szablony 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
capikaw
źródło
2
Szkoda, że ​​prawie wszystkie samouczki CoreData zaczynają się od użycia szablonu, ale nie od istniejącego projektu. Łatwo jest tutaj popełnić błąd.
Yeung
24

Dostałem taką wiadomość, gdy miałem dwa pliki, które były od siebie zależne. Trudne jest to, że otrzymasz okrągłe odniesienie, jeśli tylko spróbujesz się zaimportować (klasa A importuje klasę B, klasa B importuje klasę A) z ich plików nagłówkowych. Zamiast tego umieść @class Adeklarację forward ( ) w pliku nagłówkowym jednej z klas (klasy B). Jednak przy próbie użycia ivara klasy A w ramach implementacji klasy B pojawia się ten sam błąd, jedynie dodanie #import "A.h"pliku .m klasy B naprawiło problem.

Szlagier
źródło
16

Próbowałem użyć @class "Myclass.h".

Kiedy zmieniłem na #import "Myclass.h", działało dobrze.

Suraj K. Thomas
źródło
Tylko uwaga: @class "Myclass.h"jest całkowicie niepoprawna. @class Myclasspowinien zostać użyty w pliku nagłówkowym, w którym nie można zaimportować klasy (z powodu odwołań cyklicznych, takich jak w przypadku klasy zdefiniowanej w Swift w Objective-C), ale #import "Myclass.h"należy ją użyć, jeśli można ją zaimportować.
Użytkownik, który nie jest użytkownikiem
6

Ty używasz

States states;

gdzie należy użyć

States *states;

Twoja metoda init powinna wyglądać tak

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

Wreszcie, kiedy zamierzasz stworzyć obiekt dla klasy States, powinieneś to zrobić w ten sposób.

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

Nie twierdzę, że to najlepszy sposób na zrobienie tego. Ale może pomóc ci zrozumieć podstawowe użycie inicjowania obiektów.

Arslan
źródło
5

Jeśli pojawia się ten błąd podczas próby użycia klasy lub metody Swift w celu C : zapomniałeś jednego z 2 kroków zdefiniowanych przez Apple na tym diagramie:

wprowadź opis zdjęcia tutaj

Przykład:

Błąd pojawia się w twoim Test.mpliku:

Odbiorca „MyClass” dla komunikatu klasy jest deklaracją przekazującą

Krok 1: sprawdź, czy Test.hma

@class MyClass;

Krok 2: znajdź *-Swift.hnazwę pliku w Ustawieniach kompilacji (poszukaj nazwy nagłówka interfejsu wygenerowanego przez Objective-C ). Nazwa będzie jakośMyModule-Swift.h

Krok 3: sprawdź, czy Test.mimportuje powyższy nagłówek

#import "MyModule-Swift.h"
Kiril S.
źródło
3

Sprawdź, czy zaimportowałeś pliki nagłówkowe klas, które zgłaszają ten błąd.

Nemezys
źródło
1

Upewnij się, że prototyp twojej metody jednostkowej znajduje się w pliku .h.

Ponieważ wywołujesz metodę wyżej w pliku niż ją definiujesz, otrzymujesz ten komunikat. Alternatywnie możesz zmienić kolejność metod, aby wywołujący znajdowali się niżej w pliku niż metody, które wywołują.

Fletch
źródło
0

Istnieją dwa powiązane komunikaty o błędach, które mogą wskazywać, że coś jest nie tak z deklaracjami i / lub importami.

Pierwszy to ten, o którym mowa, który można wygenerować, NIE umieszczając #import w pliku .m (lub .pch), deklarując @class w pliku .h.

Sekunda, którą możesz zobaczyć, gdybyś miał metodę w klasie States, taką jak:

- (void)logout:(NSTimer *)timer

po dodaniu #import jest to:

Brak widocznego interfejsu @ dla „stanów” deklaruje wylogowanie selektora:

Jeśli to zobaczysz, musisz sprawdzić i sprawdzić, czy zadeklarowałeś metodę „wylogowania” (w tym przypadku) w pliku .h klasy, którą importujesz lub przekazujesz.

W twoim przypadku potrzebujesz:

- (void)logout:(NSTimer *)timer;

w klasie .h, aby zniknął jeden lub oba z tych powiązanych błędów.

dlaczego?
źródło