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?


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.

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

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.


16

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

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


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.


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"

3

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


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ą.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.