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していないようです。

NSCopying をサポートするシン ラッパー オブジェクトで UIColor オブジェクトをラップし、etcをオーバーライド-isEqualTo:して比較が正しく機能するようにし、それらのラッパーを辞書で使用できます。

于 2010-12-16T03:47:40.953 に答える