W mojej aplikacji na iOS5 mam NSObject
States
zajęcia i próbuję je zainicjować:
states = [states init];
tutaj jest init
metoda 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?
iphone
ios
objective-c
forward-declaration
Strażnik
źródło
źródło
Odpowiedzi:
Zasadniczo oznacza to, że musisz zaimportować plik .h zawierający deklarację stanów.
W twoim kodzie jest jednak wiele innych błędów.
+alloc
. To nie zadziała[super init]
w-init
.@class
w nagłówku, ale nigdy nie zaimportowałeś klasy.źródło
.h
plik z powodu problemu z cyklicznym odwołaniem.NSObject
.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:
źródło
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 A
deklarację 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.źródło
Próbowałem użyć
@class "Myclass.h"
.Kiedy zmieniłem na
#import "Myclass.h"
, działało dobrze.źródło
@class "Myclass.h"
jest całkowicie niepoprawna.@class Myclass
powinien 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ć.Ty używasz
gdzie należy użyć
Twoja metoda init powinna wyglądać tak
Wreszcie, kiedy zamierzasz stworzyć obiekt dla klasy States, powinieneś to zrobić w ten sposób.
Nie twierdzę, że to najlepszy sposób na zrobienie tego. Ale może pomóc ci zrozumieć podstawowe użycie inicjowania obiektów.
źródło
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:
Przykład:
Błąd pojawia się w twoim
Test.m
pliku:Krok 1: sprawdź, czy
Test.h
maKrok 2: znajdź
*-Swift.h
nazwę 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.m
importuje powyższy nagłówekźródło
Sprawdź, czy zaimportowałeś pliki nagłówkowe klas, które zgłaszają ten błąd.
źródło
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ą.
źródło
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:
po dodaniu #import jest to:
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:
w klasie .h, aby zniknął jeden lub oba z tych powiązanych błędów.
źródło