Проблема при использовании UIColor RGB black в качестве ключа в NSMutableDictionary - PullRequest
3 голосов
/ 16 декабря 2010

Я могу установить объекты UIColor как ключи в NSMutableDictionary весь день, и все хорошо и счастливо ...

Например:

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

Это прекрасно работает ... ЕСЛИ Я не пытаюсь использовать следующее:

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

Это всегда дает мне:

- [UIDeviceRGBColor copyWithZone:]: нераспознанный селектор отправлен на экземпляр 0x691be80

Причины, по которым я определяю черный цвет в цветовом пространстве RGB, не важны для этого вопроса, просто знайте, что я должен определить его таким образом. Я не понимаю, почему этот и только этот цвет вызывает у меня проблемы, и почему ошибка - это ошибка copyWithZone?

Для справки, [UIColor blackColor] работает как ключ, но поскольку это не цветовое пространство RGB, оно не подходит для моего приложения.

1 Ответ

4 голосов
/ 16 декабря 2010

Похоже, что лучший вопрос - «почему каждый другой экземпляр UIColor работает как ключ»?

Ключи в NSMutableDictionary « должны соответствовать протоколу NSCopying ».UIColor объекты не соответствуют этому протоколу согласно документации , поэтому теоретически вы не можете использовать их в качестве ключей в словаре.

На практике я могу догадаться, что выВы получаете различные конкретные подклассы из кластера классов, который скрыт UIColor, и, возможно, некоторые из них, на самом деле, поддерживают NSCopying, но UIDeviceRGBColor не похоже.

Вы можете обернуть UIColorобъект в тонком объекте-обертке, который сделал поддерживает NSCopying, и переопределил -isEqualTo: и т. д., чтобы сравнения работали правильно, а затем используйте эти обертки в словаре.

...