Często umieszcza się dodatkowy, @interface
który definiuje kategorię zawierającą metody prywatne:
Person.h:
@interface Person
{
NSString *_name;
}
@property(readwrite, copy) NSString *name;
-(NSString*)makeSmallTalkWith:(Person*)person;
@end
Osoba. M:
@interface Person () //Not specifying a name for the category makes compiler checks that these methods are implemented.
-(void)startThinkOfWhatToHaveForDinner;
@end
@implementation Person
@synthesize name = _name;
-(NSString*)makeSmallTalkWith:(Person*)person
{
[self startThinkOfWhatToHaveForDinner];
return @"How's your day?";
}
-(void)startThinkOfWhatToHaveForDinner
{
}
@end
„Kategoria prywatna” (właściwa nazwa kategorii bezimiennej to nie „kategoria prywatna”, tylko „rozszerzenie klasy”) .m zapobiega wyświetlaniu przez kompilatorowi ostrzeżenia, że metody są zdefiniowane. Jednakże, ponieważ @interface
w pliku .m jest kategorią, nie można w niej zdefiniować ivars.
Aktualizacja 6 sierpnia '12: Cel-C ewoluował od czasu napisania tej odpowiedzi:
ivars
można zadeklarować w rozszerzeniu klasy (i zawsze może być - odpowiedź była niepoprawna)
@synthesize
Nie jest wymagane
ivars
można teraz zadeklarować w nawiasach na górze @implementation
:
to jest,
@implementation {
id _ivarInImplmentation;
}
@end
@interface Person ()
wystarczy.class extension
nie acategory
@interface className ()
) będą teraz generalnie zawierać tylko prywatne pliki@property
s.źródło
możesz nawet utworzyć inne klasy w pliku .m, na przykład inne małe klasy, które dziedziczą po klasie zadeklarowanej w pliku .h, ale zachowują się nieco inaczej. Możesz użyć tego we wzorcu fabrycznym
źródło