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ń.
Nie zgadzam się, że należy mieszać metody prywatne (kategorię) z regularną implementacją. To kwestia stylu, ale lubię utrzymywać wyraźną separację. –
Warto zauważyć, że kontynuacja klasy (to, co nazywamy rozszerzeniem klasy) jest nowa w systemie Leopard. –
@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