2010-05-04 2 views
8

Я пытался сделать частную собственность в моем *.m файле:Как сделать частную собственность?

@interface MyClass (Private) 
@property (nonatomic, retain) NSMutableArray *stuff; 
@end 

@implementation MyClass 
@synthesize stuff; // not ok 

Компилятор утверждает, что нет вещи собственности объявлены. Но есть вещи. Просто анонимная категория. Позвольте мне угадать: Невозможно. Другие решения?

ответ

14

Вы хотите использовать «расширение класса», а не категория:

@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 
+0

Вместо повторного объявления свойства в файле .m вместо этого вы можете просто написать код, который непосредственно устанавливает неявную переменную, поддерживающую это свойство. Эта неявная переменная имеет одно и то же имя с префиксом подчеркивания. Для ясности обращайтесь к нему с помощью «Я» плюс стрелка (дефис + RightAngle): self -> _ myProperty = ... независимо ...; –

Смежные вопросы