2010-12-16 4 views
3

, je peux configurer des objets UIColor comme clés dans une NSMutableDictionary toute la journée et tout va bien et heureux ...problème lors de l'utilisation UIColor RGB noir comme une clé dans une NSMutableDictionary

Par exemple:

[myDict setObject:foo forKey:[UIColor redColor]]; 

Cela fonctionne très bien ... à moins que j'essaie d'utiliser ce qui suit:

UIColor *black = [[UIColor alloc] initWithRed:0 green:0 blue:0 alpha:1]; 
[myDict setObject:foo forKey:black]; 

Cela me donne toujours:

- [UIDeviceRGBColor copyWithZone]: sélecteur non reconnu envoyé à l'instance 0x691be80

Les raisons pour lesquelles je suis dans la définition de noir RVB ne sont pas importants colorspace à cette question, il suffit de savoir que je dois définir cette façon. Qu'est-ce que je ne comprends pas, c'est pourquoi cette couleur et cette seule cause me cause un problème, et pourquoi est-ce que l'erreur est une erreur copyWithZone? Pour l'anecdote, [UIColor blackColor] fonctionne comme une clé, mais comme il ne s'agit pas d'un espace colorimétrique RVB, il ne convient pas à mon application.

Répondre

4

Il semble que la meilleure question soit "pourquoi toutes les autres instances d'UIColor fonctionnent-elles comme une clé"?

Clés dans un NSMutableDictionary "must conform to the NSCopying protocol". UIColor objets ne sont pas conformes à ce protocole per the documentation, donc vous êtes théoriquement incapable de les utiliser comme des clés dans un dictionnaire. En pratique, je suppose que vous obtenez différentes sous-classes concrètes d'un cluster de classe masqué par UIColor, et peut-être que certaines d'entre elles supportent en fait NSCopying, mais UIDeviceRGBColor ne semble pas le faire.

Vous pouvez envelopper l'objet UIColor dans un objet mince enveloppe qui a fait NSCopying de soutien, et passer outre -isEqualTo: etc pour obtenir les comparaisons fonctionnent correctement, puis utiliser ces emballages dans le dictionnaire.

+0

Oui, cela semble faire senese. Je me demande si vous pourriez implémenter copyWithZone dans votre propre catégorie UIDeviceRGBColor. –

+0

Intéressant! Je n'ai pas pensé à vérifier puisque toutes les UIColors prédéfinies fonctionnent comme des clés ... Si j'avais une Catégorie, je devrais aussi redéfinir le hachage, n'est-ce pas? –

+2

Ajout du code suivant dans une catégorie sur UIColor semble avoir résolu le problème: - (id) copyWithZone: (NSZone *) zone { \t CGColorRef cgcopy = CGColorCreateCopy ([self CGColor]); \t UIColor * copy = [[[self class] allocWithZone: zone] initWithCGColor: cgcopie]; \t Copie de retour; } –

Questions connexes