2008-10-31 5 views
30

W ciągu ostatniego miesiąca uczyłem się Objective-C (jestem głową Javy), a ja mam teraz większość mojego mózgu. Jedna rzecz, która mnie obecnie dezorientuje: jaka jest różnica między importowaniem klasy przez klasę @ a używanie #importu?Jaka jest różnica między #import i @class, a kiedy powinienem używać jednego na drugim?

Czy jest lepszy niż inny, czy w niektórych przypadkach muszę użyć jednego zamiast drugiego? Do tej pory używałem tylko #import.

Odpowiedz

66

#import przenosi cały plik nagłówkowy, o którym mowa, do bieżącego pliku; wszelkie pliki, które TAK znajdują się w pliku #import. @class, z drugiej strony (gdy jest używany sam w sobie z niektórymi nazwami klas), po prostu mówi kompilatorowi "Hej, wkrótce zobaczysz nowy token, to jest klasa, więc potraktuj to w ten sposób).

Jest to bardzo przydatne, gdy masz potencjał "kołowego obejmuje", tzn. Object1.h odnosi się do Object2, a Object2.h odnosi się do Object1 .Jeśli masz #import oba pliki do drugiego, kompilator może się mylić, ponieważ próbuje #import Object1.h, patrzy na niego i widzi Object2.h; próbuje #import Object2.h i widzi Object1.h itp

Jeśli, z drugiej strony, każdy z tych plików ma @class Object1; lub @class Object2;, wtedy nie ma odwołania cyklicznego. • Upewnij się, że faktycznie wymagane są nagłówki w plikach implementacyjnych (.m).

+2

Ben, Ben, nie trzeba odpowiedzieć na każde pytanie kakao na przepełnienie stosu. Spalisz się! – schwa

+2

musi ... przestać ... odpowiadać ... –

5

Inną rzeczą, o której warto pamiętać, jest to, że #imports spowalnia czas kompilacji, ponieważ oznacza to, że kompilator musi pobrać i przetworzyć dużo więcej plików nagłówkowych. Najczęściej jest to maskowane przez użycie prekompilowanych nagłówków, ale od czasu do czasu przekazywano mi projekty, które corsy importowały każdy nagłówek, zamiast używać @klasy w odpowiednich przypadkach, a ich poprawianie może poprawić czas kompilacji. To subtelny sposób, w jaki system wzmacnia fakt, że jeśli używasz tylko tego, czego naprawdę potrzebujesz, rzeczy idą szybciej.

Zgodnie z ogólną zasadą zawsze używam deklaracji @class w moich plikach nagłówkowych i tylko # naśladuję nadklasę. Jest to zgodne z sugestiami Bena, ale pomyślałem, że warto zauważyć, że nawet jeśli nie martwisz się o okrągłe znaki, dobrym pomysłem jest ograniczenie #imports do plików nagłówkowych, jeśli możesz.

27

@class jest nazywana deklaracją forward . Zasadniczo mówisz kompilatorowi, że klasa istnieje, ale nie ma nic o klasie. Tak więc nie zna rzeczy takich jak jego nadklasa i jakie metody deklaruje.

Zgodnie z ogólną zasadą, używaj @class w .h i #import w .m, jeśli w ogóle możliwe. Jak powiedział Louis, pomoże to skrócić czas kompilacji. Są jednak czasy, kiedy musisz #import klasę w nagłówku. Przypadki mogę myśleć teraz to:

  • jesteś instacji inną klasę
  • Jesteś wdrożenie protokołu

W tych przypadkach należy #import plik nagłówka, gdzie klasa lub protokół zadeklarowane, ponieważ kompilator musi znać pełną klasową hierarchię swoich klas nadrzędnych i implementować protokoły.

FWIW można przekazać protokoły deklarują też, tak długo jak nie ich realizacji:

@protocol SomeProtocol; 

@interface ... 

- (id<SomeProtocol>)someMethod; 

@end 
Powiązane problemy