我可以整天将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色彩空间,因此不适合我的应用程序。
答案 0 :(得分:4)
看起来更好的问题是“为什么每个其他UIColor实例都作为关键”?
NSMutableDictionary中的键“must conform to the NSCopying protocol”。 UIColor
个对象不符合该协议per the documentation,因此理论上无法将它们用作字典中的键。
在实践中,我可能会猜到你正在从UIColor
隐藏的类集群中获取各种具体子类,并且可能其中一些实际上支持NSCopying,但是UIDeviceRGBColor
似乎没有。
您可以将UIColor对象包装在支持NSCopying 支持NSCopying的瘦包装器对象中,并覆盖-isEqualTo:
等以使比较正常工作,然后在字典中使用这些包装器