Вы хотите использовать «расширение класса», а не категория:
@interface MyClass()
@property (nonatomic, retain) NSMutableArray *stuff;
@end
@implementation MyClass
@synthesize stuff; // ok
расширения класса были созданы в Objective-C 2.0 в части, специально для этой цели. Преимущество расширений классов заключается в том, что компилятор рассматривает их как часть первоначального определения класса и может, таким образом, предупреждать о неполных реализациях.
Помимо чисто частных свойств, вы также можете создавать общедоступные свойства только для чтения, которые внутренне читаются и записываются. Свойство может быть повторно объявлено в расширениях класса только для изменения доступа (readonly vs. readwrite), но должно быть идентичным в декларации иначе. Таким образом, вы можете:
//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
Вместо повторного объявления свойства в файле .m вместо этого вы можете просто написать код, который непосредственно устанавливает неявную переменную, поддерживающую это свойство. Эта неявная переменная имеет одно и то же имя с префиксом подчеркивания. Для ясности обращайтесь к нему с помощью «Я» плюс стрелка (дефис + RightAngle): self -> _ myProperty = ... независимо ...; –