2010-05-04 14 views
8

Ich versuchte, ein Privateigentum in meiner *.m Datei zu machen:Wie mache ich ein Privateigentum?

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

@implementation MyClass 
@synthesize stuff; // not ok 

Compiler behauptet, dass keine Sachen Eigenschaft erklärt gibt. Aber da ist ein Zeug. Nur in einer anonymen Kategorie. Lass mich raten: Unmöglich. Andere Lösungen?

Antwort

14

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

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 ...; –