Sie wollen eine „Klassenerweiterung“ verwenden, anstatt eine Kategorie:
@interface MyClass()
@property (nonatomic, retain) NSMutableArray *stuff;
@end
@implementation MyClass
@synthesize stuff; // ok
Klasse Erweiterungen wurden in Objective-C 2.0 teilweise die speziell für diesen Zweck. Der Vorteil von Klassenerweiterungen liegt darin, dass der Compiler sie als Teil der ursprünglichen Klassendefinition behandelt und somit vor unvollständigen Implementierungen warnen kann.
Neben rein privaten Eigenschaften können Sie auch schreibgeschützte öffentliche Eigenschaften erstellen, die intern schreibgeschützt sind. Eine Eigenschaft kann in einer Klassenerweiterung nur neu deklariert werden, um den Zugriff zu ändern (readonly vs. readwrite), muss aber ansonsten in der Deklaration identisch sein. So können Sie tun:
//MyClass.h
@interface MyClass : NSObject
{ }
@property (nonatomic,retain,redonly) NSArray *myProperty;
@end
//MyClass.m
@interface MyClass()
@property (nonatomic, retain, readwrite) NSArray *myProperty;
@end
@implementation MyClass
@synthesize myProperty;
//...
@end
Anstatt die Eigenschaft in der .m-Datei erneut zu deklarieren, können Sie stattdessen einfach Code schreiben, der direkt die implizite Variable festlegt, die diese Eigenschaft unterstützt. Diese implizite Variable hat denselben Namen, dem ein Unterstrich vorangestellt ist. Um die Übersichtlichkeit zu erhöhen, verwenden Sie 'self' und einen Pfeil (Bindestrich + RightAngle): self -> _ myProperty = ... whatever ...; –