2010-02-25 2 views
3

Je suis un peu confus avec le codage de valeur de clé et les relations trop nombreuses. J'ai lu que lorsque j'ai une telle relation je devrais utiliser [object mutableArrayValueForKey: @ "key"]; pour récupérer le tableau mutable qui contient les objets dans cette relation ordonnée. Qu'est-ce que je ne comprends pas, c'est quelle est la différence entre mutableArrayValueForKey ou juste valueForKey.codage de valeurs-clés et relations trop nombreuses

Permettez-moi d'illustrer par un exemple (tableau est un NSMutableArray de configuration auto comme une propriété):

id array1= [self valueForKey:@"array"]; 

NSLog(@"first element %@",[array1 objectAtIndex:1]); 

id array2 = [self mutableArrayValueForKey:@"array"]; 

NSLog(@"first element %@",[array2 objectAtIndex:1]); 

Les deux appels reviennent exactement la même chose. Dans ce cas, quel est le bénéfice ou différent du second?

À la votre!

Répondre

6

mutableArrayValueForKey ne retourne pas "tableau", il retourne un proxy pour "tableau". Vous pouvez le voir si vous imprimez les classes:

NSLog(@"%@", [self.array class]); 
NSLog(@"%@", [[self valueForKey:@"array"] class]); 
NSLog(@"%@", [[self mutableArrayValueForKey:@"array"] class]); 

Cette impression:

2010-02-24 20:06:44.258 Untitled[25523:a0f] NSCFArray 
2010-02-24 20:06:44.275 Untitled[25523:a0f] NSCFArray 
2010-02-24 20:06:44.276 Untitled[25523:a0f] NSKeyValueSlowMutableArray 

Relisez la documentation pour mutableArrayValueForKey pour plus de détails sur la façon dont fonctionne proxy. Dans ce cas particulier, vous avez un vrai NSMutableArray en tant que ivar. Mais que faire s'il n'y avait pas un tel ivar? Vous pouvez implémenter KVC sans ivar soutenant la propriété, avec des méthodes comme countOf<Key> et objectIn<Key>AtIndex:. Il n'y a pas de règle qu'il y ait un ivar "tableau" réel, tant que vous pouvez renvoyer des résultats sensés aux méthodes KVC. Mais que se passe-t-il si vous voulez exposer une interface NSMutableArray, mais vous n'avez pas de véritable NSMutableArray? C'est pour cela que mutableArrayValueForKey est pour. Il renvoie un proxy qui, lorsqu'il est accédé, se traduira par des méthodes KVC, y compris l'envoi de mutations vers de nombreuses méthodes telles que insertObject:in<Key>AtIndex:.

Cela arrive même dans le cas où vous avez un vrai ivar (comme dans votre cas), vous ne le remarquez pas parce que le proxy se comporte comme l'objet réel.

+0

Yay pour expliquer en détail! – dreamlax

+0

merci pour la réponse! – theprole

0

Le premier élément est réellement objectAtIndex:0, et non objectAtIndex:1. De plus, la seconde méthode garantit que vous pouvez modifier le tableau retourné avec addObject: et removeObjectAtIndex:, même si la valeur de la clé @"array" est un tableau immuable.

+0

oui je sais que le premier élément est 0. le code n'implique pas qu'il était le premier. Le deuxième point a du sens, mais est-ce le seul avantage? qu'il renvoie un tableau mutable? Pourquoi (si l'objet original est un NSMutableArray) valueForKey ne renvoie pas un mutable? – theprole

+0

en outre, si vous écrivez votre tableau (NSMutableArray *); méthode de telle manière qu'elle retourne un NSMutableArray, alors le premier appel obtiendra en fait un tableau mutable, donc il pourra utiliser addObject: – theprole

+3

Le code dit 'NSLog (@" premier élément% @ ", ...) 'puis enregistre l'élément * second *. – dreamlax

Questions connexes