2010-05-04 3 views
8

J'ai essayé de faire une propriété privée dans mon dossier *.m:Comment faire une propriété privée?

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

@implementation MyClass 
@synthesize stuff; // not ok 

compilateur prétend qu'il n'y a pas de propriété de choses déclarées. Mais il y a un truc. Juste dans une catégorie anonyme. Laisse-moi deviner: Impossible. D'autres solutions?

Répondre

14

Vous voulez utiliser une « extension de classe » plutôt qu'une catégorie:

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

@implementation MyClass 
@synthesize stuff; // ok 

extensions de classe ont été créés en Objective-C 2.0 en partie à cet effet. L'avantage des extensions de classe est que le compilateur les traite dans le cadre de la définition de classe d'origine et peut donc signaler des implémentations incomplètes. En plus des propriétés purement privées, vous pouvez également créer des propriétés publiques en lecture seule qui sont en lecture-écriture en interne. Une propriété peut être re-déclarée dans une extension de classe uniquement pour changer l'accès (readonly vs. readwrite) mais doit être identique dans la déclaration sinon. Ainsi, vous pouvez faire:

//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

Au lieu de re-déclarer la propriété dans le fichier .m, vous pouvez simplement écrire du code qui définit directement la variable implicite sauvegardant cette propriété. Cette variable implicite a le même nom préfixé d'un trait de soulignement. Pour plus de clarté, accédez-y en utilisant 'self' plus une flèche (trait d'union + RightAngle): self -> _ myProperty = ... peu importe ...; –

Questions connexes