2008-12-11 16 views
6

widzę jakiś kod mam odziedziczone że wygląda następująco:Wykorzystanie Kategoria w Objective-C

@interface SomeClass (private) 

leży to w SomeClass.m, pliku wdrażania. Jest dołączony plik nagłówkowy, który nie sugeruje, że klasa używa kategorii. Czy w tym przypadku jest to po prostu słaba nazwa nadana kategorii dla SomeClass? I zakładam, że jest całkowicie uzasadnione określenie takich kategorii w implementacji?

Odpowiedz

31

To nie jest nazwa "prywatna", która czyni ją prywatną; metody są prywatne, ponieważ znajdują się w kategorii zadeklarowanej w pliku implementacji.

Istnieją trzy zastosowania kategorii, z których każda dodać metody do klasy (uwaga: tylko metodami nie Ivars)

rozszerzenia istniejącej klasy Cocoa

To pozwala dodać własną rękę metody do istniejącej klasy. Na przykład, jeśli chcesz przedłużyć NSString, aby zastosować specjalne wielkie litery, możesz utworzyć nową klasę, na przykład NSString + Capitals. w NSString + Capitals.h trzeba:

@interface NSString (Capitals) 

-(NSString *)alternateCaps:(NSString *)aString; 

@end 

aw NSString + Capitals.m można zaimplementować metodę

@implementation NSString (Capitals) 
-(NSString *)alternateCaps:(NSString *)aString 
{ 
    // Implementation 
} 

metody prywatne na klasy

To jest to samo, co powyżej, z tym wyjątkiem, że dodatkowe metody są zadeklarowane i zdefiniowane w pliku implementacji (.m) Zwykle sposobem posiadania prywatnych metod - ponieważ nie znajdują się w pliku .h (który jest tym # przypisanym przez inne klasy) po prostu nie są widoczny. W tym przypadku implementacja metod odbywa się we własnym bloku implementacji. np

// someClass.m 
@interface someClass (extension) 
-(void)extend; 
@end 

@implementation someClass 
    // all the methods declared in the .h file and any superclass 
    // overrides in this block 
@end 

@implementation someClass (extension) 
-(void)extend { 
    // implement private method here; 
} 

Class Przedłużenie (New 10,5 Leopard)

Prostszym sposobem posiadania metod prywatnych. W tym szczególnym przypadku nazwa kategorii jest pusta, a prywatne metody są zaimplementowane w tym samym bloku, co wszystkie inne metody klasy.

// someClass.m 
@interface someClass() 
-(void)extend; 
@end 

@implementation someClass 
    // all the methods declared in the .h file and any superclass 
    // overrides in this block 
    // Implement private methods in this block as well. 
-(void)extend { 
    // implement private method here; 
} 

@end 

Oto link do docs firmy Apple na kategoriach i rozszerzeń.

+0

Nie zgadzam się, że należy mieszać metody prywatne (kategorię) z regularną implementacją. To kwestia stylu, ale lubię utrzymywać wyraźną separację. –

+0

Warto zauważyć, że kontynuacja klasy (to, co nazywamy rozszerzeniem klasy) jest nowa w systemie Leopard. –

+0

@Peter. Dziękuję za wskazanie tego. @Marc. W przypadku, gdy kategoria jest pusta, metody muszą zostać zaimplementowane w głównym bloku. Jednak stosując drugą metodę, zgadzam się, że lepiej jest umieścić implementacje kategorii w swoim własnym bloku. – Abizern

2

"Prywatne" to tylko nazwa sugerująca, że ​​metody nie są publiczne i są używane do wewnętrznej implementacji klasy, ale nie ma nic w deklaracji kategorii, która to wymusza.

Ponadto metody zdefiniowane w kategorii są dodawane do definicji klasy w czasie wykonywania, więc towarzyszący plik nagłówkowy nie musi deklarować, że używa kategorii - zostaje automatycznie "użyty".

2

Używam tego, aby dać mi gdzieś zadeklarować (a tym samym udokumentować, a także zamknąć kompilator około) pomocnicze metody, które nie muszą być w interfejsie publicznym. Następnie "konsumenci" klasy są (milcząco, zważywszy, że nic nie stoi na przeszkodzie, poza dobrymi manierami) ograniczonymi do stosowania metod zdefiniowanych w pliku nagłówkowym.