2010-08-14 6 views
2

Je vais expliquer ma question à partir d'un exemple.Objective C Encapsulation

Dans le fichier .H //

@interface Employee:NSObject{ 

@private 

NSString *name; 

} 

@property(nonatomic,retain) NSString *name; 

dans le fichier .M //

@implementation{ 

@synthesize name; 

} 

Dans ce scénario quand j'accéder à la propriété du nom dans une autre classe, comme myEmp.Name = @"John"; elle ne présente pas soulever n'importe quel problème. Est-ce que cela est conforme aux règles d'encapsulation ou suis-je malentendu?

+0

Merci. Je ne le savais pas. :-) –

+0

Hi..Avez-vous une idée exacte de l'encapsulation dans iOS? Dans votre exemple pouvons-nous dire qu'il s'agit d'un exemple d'encapsulation pour iOS? – sinh99

Répondre

2

En Objective-C, seule une méthode d'instance d'objet peut accéder à une variable d'instance. Un objet externe n'a aucun moyen d'accéder directement aux variables d'instance d'un objet. Le @private n'est pertinent que pour l'héritage.

Pour rendre les variables accessibles, il existe des propriétés. Une propriété définit une méthode et les méthodes sur Objective-C sont toutes publiques. Objective-C ne peut en aucun cas définir les méthodes privées, vous pouvez seulement les "cacher" en les déclarant ailleurs que dans le fichier public .h (par exemple dans le fichier .m via @interface Employee() qui déclare une section anonyme).

+1

Il est trivialement facile d'accéder aux ivars directement à partir d'objets externes, indépendamment de la présence ou de l'absence de '@ private'. – bbum

+0

@bbum: Vous avez raison, je supposais que Objective-C se comporte de la même manière que Ruby ici ... – DarkDust

7

Vous n'avez pas enfreint les règles d'encapsulation, car le @property(nonatomic,retain) NSString *name; indique déjà que vous souhaitez exposer les getters/setters pour name.

Encapsulation est brisé que lorsque vous accédez directement au Ivar, à savoir

myEmp->name = @"John"; // wrong 
+0

Pourquoi était-ce downvoted? Semble juste pour moi. –

+0

S'il n'y a pas de propriétés pour les données dans la classe, l'utilisation de l'objet> ivarName serait le seul moyen d'accéder aux ivars dans une méthode isEqualTo. –

5

Je pense que vous avez mal compris ce que @property et @synthesize sont pour. Ce sont des moyens pratiques pour définir les méthodes d'accès. c'est à dire. ce que vous avez est équivalent à: -

- (NSString *)name; 
- (void)setName:(NSString *)value; 

myEmp.name = @"John" est le sucre syntaxique pour [myEmp setName:@"John"]

Alors vous avez créé explicitement les méthodes facultatives accesseurs public et puis les utiliser. Aucune encapsulation cassée ici.