【问题标题】:Problem when using UIColor RGB black as a key in an NSMutableDictionary使用 UIColor RGB black 作为 NSMutableDictionary 中的键时出现问题
【发布时间】:2010-12-16 03:34:38
【问题描述】:

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

【问题讨论】:

    标签: iphone key nsmutabledictionary uicolor copywithzone


    【解决方案1】:

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

    NSMutableDictionary "must conform to the NSCopying protocol" 中的键。 UIColor 对象不符合该协议 per the documentation,因此理论上您无法将它们用作字典中的键。

    在实践中,我可能猜想您从 UIColor 隐藏的类集群中获取了各种具体的子类,并且实际上可能其中一些确实支持 NSCopying,但 UIDeviceRGBColor 似乎不支持。

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

    【讨论】:

    • 是的,这似乎是有道理的。我想知道您是否可以在自己的 UIDeviceRGBColor 类别中实现 copyWithZone。
    • 有趣!我没想过要检查,因为所有预定义的 UIColors 都作为键工作......如果我做了一个类别,我也需要覆盖哈希,对吗?
    • 在 UIColor 的类别中添加以下代码似乎解决了问题: -(id)copyWithZone:(NSZone *)zone { CGColorRef cgcopy = CGColorCreateCopy([self CGColor]); UIColor *copy = [[[self class] allocWithZone:zone] initWithCGColor:cgcopy];返回副本; }
    • @MGM-Diatom:好主意。这似乎也会起作用。小心,因为你正在泄漏你在这里创建的 CGColorRef(一旦你用它初始化了 UIColor,你就可以释放它)。
    猜你喜欢
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 2021-12-09
    • 2012-02-26
    • 1970-01-01
    相关资源
    最近更新 更多