Es ist üblich, eine zusätzliche zu setzen @interface
Kategorie einzufügen, die eine Kategorie definiert, die private Methoden enthält:
Person.h:
@interface Person
{
NSString *_name;
}
@property(readwrite, copy) NSString *name;
-(NSString*)makeSmallTalkWith:(Person*)person;
@end
Person.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
Die 'private Kategorie' (der richtige Name für eine namenlose Kategorie ist nicht 'private Kategorie', sondern 'Klassenerweiterung') .m verhindert, dass der Compiler warnt, dass die Methoden definiert sind. Da es sich bei der @interface
in der .m-Datei um eine Kategorie handelt, können Sie darin keine ivars definieren.
Update 6. August '12: Objective-C hat sich weiterentwickelt, seit diese Antwort geschrieben wurde:
ivars
kann in einer Klassenerweiterung deklariert werden (und könnte es immer sein - die Antwort war falsch)
@synthesize
ist nicht nötig
ivars
kann jetzt in geschweiften Klammern oben angegeben werden @implementation
:
das ist,
@implementation {
id _ivarInImplmentation;
}
//methods
@end
@interface Person ()
wird genügen.class extension
nicht acategory
@interface className ()
) im Allgemeinen nur private@property
s enthalten .quelle
Sie können sogar andere Klassen in der .m-Datei erstellen, z. B. andere kleine Klassen, die von der in der .h-Datei deklarierten Klasse erben, jedoch ein geringfügig anderes Verhalten aufweisen. Sie können dies in einem Fabrikmuster verwenden
quelle