68 votes

propriété privée en Objective C

Existe-t-il un moyen de déclarer une propriété privée en Objective C ? Le but est de bénéficier de getters et setters synthétisés implémentant un certain schéma de gestion de la mémoire, mais non exposés au public.

Une tentative de déclarer une propriété dans une catégorie conduit à une erreur :

@interface MyClass : NSObject {
    NSArray *_someArray;
}

...

@end

@interface MyClass (private)

@property (nonatomic, retain) NSArray   *someArray;

@end

@implementation MyClass (private)

@synthesize someArray = _someArray;
// ^^^ error here: @synthesize not allowed in a category's implementation

@end

@implementation MyClass

...

@end

100voto

Mark Adams Points 17189

J'implémente mes propriétés privées comme ceci.

MaClasse.m

@interface MyClass ()

@property (nonatomic, retain) NSArray *someArray;

@end

@implementation MyClass

@synthesize someArray;

...

C'est tout ce dont vous avez besoin.

10voto

Oliver Points 901

A. Si vous voulez une variable complètement privée. Ne lui donnez pas de propriété.
B. Si vous voulez une variable en lecture seule qui soit accessible en dehors de l'encapsulation de la classe, utilisez une combinaison de la variable globale et de la propriété :

//Header    
@interface Class{     
     NSObject *_aProperty     
}

@property (nonatomic, readonly) NSObject *aProperty;

// In the implementation    
@synthesize aProperty = _aProperty; //Naming convention prefix _ supported 2012 by Apple.

En utilisant le modificateur readonly, nous pouvons maintenant accéder à la propriété n'importe où en externe.

Class *c = [[Class alloc]init];    
NSObject *obj = c.aProperty;     //Readonly

Mais en interne, nous ne pouvons pas définir une propriété à l'intérieur de la classe :

// In the implementation    
self.aProperty = [[NSObject alloc]init]; //Gives Compiler warning. Cannot write to property because of readonly modifier.

//Solution:
_aProperty = [[NSObject alloc]init]; //Bypass property and access the global variable directly

6voto

Rog Points 12427

Comme d'autres l'ont indiqué, il n'y a (actuellement) aucun moyen de déclarer véritablement une propriété privée dans Objetive-C.

Une des choses que vous pouvez faire pour essayer de "protéger" les propriétés d'une manière ou d'une autre est d'avoir une classe de base avec la propriété déclarée en tant que readonly et dans vos sous-classes, vous pouvez redéclarer la même propriété en tant que readwrite .

La documentation d'Apple sur les propriétés redéclarées se trouve ici : http://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW19

6voto

Anomie Points 43759

Cela dépend de ce que vous entendez par "privé".

Si vous voulez simplement dire "non documenté publiquement", vous pouvez assez facilement utiliser un fichier extension de classe dans un en-tête privé ou dans le fichier .m.

Si vous voulez dire "les autres ne sont pas en mesure de l'appeler du tout", vous n'avez pas de chance. Tout le monde peut appeler la méthode s'il connaît son nom, même si elle n'est pas documentée publiquement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X