3

我可以整天将 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 颜色空间,因此不适合我的应用程序。

4

1 回答 1

4

看起来更好的问题是“为什么所有其他 UIColor 实例都作为键工作”?

NSMutableDictionary 中的键“必须符合 NSCopying 协议”。根据文档UIColor,对象不符合该协议,因此理论上您无法将它们用作字典中的键。

在实践中,我可能会猜测您从隐藏的类集群中获得了各种具体的子类UIColor,也许其中一些确实支持 NSCopying,但UIDeviceRGBColor似乎并不支持。

您可以将 UIColor 对象包装在一个支持 NSCopying 的薄包装器对象中,覆盖-isEqualTo:等以使比较正常工作,然后在字典中使用这些包装器。

于 2010-12-16T03:47:40.953 回答