2010-10-11 13 views

Odpowiedz

83

To deklaracja terminowa. Zasadniczo mówi kompilatorowi, że istnieje klasa o tej nazwie. Używam go w deklaracji interfejsu:

@class Foo; 
@interface Bar : NSObject { 
    Foo *someFoo; 
} 
@end 

Oczywiście można importować nagłówek dla Foo zamiast:

#import "Foo.h" 
@interface Bar : NSObject { 
    Foo *someFoo; 
} 
@end 

Ale jeśli someFoo nie jest narażony na użytkowników Bar, będą importować dodatkowy nagłówek plik, który nie przydaje się dla nich. Z deklaracją @class użytkownicy Bar nie widzą dodatkowego importu, ponieważ Foo.h zostanie zaimportowany do pliku implementacji Bar.

+1

Błyskotliwe wyjaśnienie, właśnie nauczyłem się czegoś nowego! Dziękuję – pnizzle

+0

Nadal nie rozumiem tego w pełni i znam jego stary post, ale przykład będzie dobry. Co masz na myśli przez "użytkowników paska", które mają bar jako obiekt w nich? Imean w twoim przykładzie Foo jest obiektem w Bar. Czy w takiej sytuacji różnica między #import i @class jest tak duża? – Esko918

+0

Rzeczywiście wspaniałe wyjaśnienie. Zmierzyłem się z sytuacją wcześniej, w której powinienem był jej użyć. Tak czy inaczej, teraz na pewno mogę. :) – Ron

23

to tak zwana deklaracja terminowa.

używasz tej dyrektywy, aby powiedzieć kompilatorowi, że istnieje klasa objc o podanej nazwie. inne opcje obejmują interfejs lub użyj identyfikatora dla zmiennych lub typów.

jest to pomocne w celu zminimalizowania zależności. Używam ich, kiedy tylko mogę, aby zminimalizować zależności i znacznie skrócić czas budowania.

jest taka sama jak w C i C++:

struct mon_struct; 
namespace MON { class mon_class; } 
+3

+1 za napiwek, który powinien być preferowany w celu skrócenia czasu budowy. –

1

@class służy do tworzenia przodu deklarację dowolnej klasy. Jeśli tworzysz jakąś klasę, której implementacja jest dla ciebie nieznana, możesz to zrobić, korzystając z dyrektywy kompilatora @class.

Możesz wdrożyć tę klasę, gdy znana jest implementacja.

8

nadzieję, że pomoże trochę więcej

powyższa odpowiedź już stwierdzić niemal każdą rzecz, chciałbym dodać kilka rzeczy na jej temat.

Numer @class Foo jest deklaracją typu Foo. To tak, jakby powiedzieć kompilatorowi, istnieje klasa foo Więc nie przejmuj się tym teraz.

Uwaga: - Deklaracja klasy staje się bardzo krytyczna, gdy obie klasy potrzebują się nawzajem. jeśli zrobimy zwykłe polecenie #import, będziemy mieli nieskończoną pętlę importu, a kompilatory nie lubią nieskończonych pętli. Więc używamy @class Classname.