2013-04-07 9 views

Odpowiedz

7

Ma to związek z widocznością zawartości @interface. Gdy jest zawarty w pliku nagłówkowym, jest dostępny dla innych klas, aby zobaczyć, kiedy importuje plik nagłówkowy. Gdy jest zawarty w pliku implementacji, zawartość jest dostępna tylko dla tego pliku implementacji. Zazwyczaj, gdy jest zadeklarowany w pliku implementacji, odbywa się to poprzez rozszerzenie klasy (tj. @interface ClassName(), () oznacza kategorię rozszerzenia/anonimowości), chociaż można użyć nazwanej kategorii, jeśli jest to pożądane.

Jest kilka powodów, dla których tak się dzieje. Głównym jest zdefiniowanie prywatnych zmiennych lub właściwości. Nie chcesz, aby były one dostępne dla wszystkich, którzy importują plik nagłówkowy, ale potrzebujesz miejsca do przechowywania informacji wewnętrznych. Na przykład, pozwoli to m_isActive być wykorzystane w ciągu zaledwie realizacji:

@interface Class() { 
    BOOL m_isActive; 
} 

Można także zmienić właściwości tylko do odczytu zadeklarowane w pliku nagłówka, tak, że plik realizacja ma readwrite dostęp do niej przy użyciu notacji dot. Na przykład:

Header:

@interface Class 
@property (nonatomic, readonly) NSString* name; 
@end 

Realizacja:

@interface Class() 
@property (nonatomic) NSString* name; 
@end 

@implementation Class 
... 
    self.name = @"WDUK"; // This is allowed, as the class extension has overridden the readonly attribute via a redeclaration of the property 
... 
@end 

Innym popularnym zastosowaniem jest prywatnie deklarują, że są zgodne z poszczególnych protokołów, które jest szczegółów wdrażania i nie muszą być wystawione w publicznym pliku nagłówkowym. Na przykład, gdy implementacja używa obiektu, który wymaga, aby był delegatem, i nie chcesz zanieczyszczać pliku nagłówkowego protokołem, który nie jest używany poza klasą.

Inne zastosowania (które zostały pozostawione w ciemności z nowymi poprawkami LLVM/Clang) miały na celu zdefiniowanie prywatnych metod. Nie jest to już wymagane, ponieważ kompilator będzie szukać metod, które nie zostały zadeklarowane w odpowiednim pliku nagłówkowym, i zakłada, że ​​są one prywatne dla klasy i same je deklarują.

Kluczową częścią wziąć z tego wszystkiego jest to, że coś wewnątrz @interface w pliku nagłówkowym (wyjątkiem zmiennych instancji określonych tam poprzez @private lub @protected) są publiczne, a wszystko w pliku wdrażania jest z natury prywatnej.

+1

Innym zastosowaniem rozszerzenia klasy jest prywatne oświadczenie, że klasa jest zgodna z jednym lub większą liczbą protokołów. – rmaddy

+0

Pokonaj mnie, by uderzyć, dodawał to już! Jednak bardzo dobry punkt. – WDUK

+0

O czym mówią te protokoły? –

2

Ten w pliku nagłówkowym określa interfejs publiczny.

W pliku implementacji znajduje się rozszerzenie klasy o rozszerzeniu, które rozszerza publiczny interfejs o dowolne prywatne szczegóły implementacji.

Powiązane problemy