UIColor のコピーでエラーにならないようにする : Objective-C プログラミング
PROGRAM
UIColor のコピーでエラーにならないようにする
たとえば UIColor をクラスのプロパティにするために次のように宣言したとします。
@interface aClass : NSObject
{
UIColor* _color;
}
@property (readwrite,copy) UIColor* color;
@end
このとき、@synthesize でセッターを実装(copy を設定しているので copy メソッドで生成されたインスタンスを保持するコードを生成)したり、引数に渡された色を copy メソッドを使って値を格納しようとしたりしたときに、次のような例外エラーが発生する場面がありました。
[UIDeviceRGBColor copyWithZone:]: unrecognized selector sent to instance 0x689fdf0
エラーメッセージから察するに、どうやら UIColor 型の引数として渡された色のインスタンスが、このときは実際には UIDeviceRGBColor 型のデータのようで、それが copy メソッドの内部で呼び出される copyWithZone: メソッドを持っていないことが原因のように見えます。
ちなみに、この copy メソッドと copyWithZone: メソッドとの関係については 独自クラスをディープコピーに対応させる のところで触れていますので、必要に応じて参考にしてみてください。
このエラーを回避するために、UIColor 型で受け取ったインスタンスの複製を取る場合には、次のようにするのが良さそうです。
- (void)setColor:(UIColor*)color
{
// 今回は color プロパティのセッターの例なので、設定済みの値を解放しています。
[_color release];
// UIDeviceRGBColor にも対応するため、CGColor を使って UIColor の複製を作成しています。
_color = [[UIColor colorWithCGColor:color.CGColor] retain];
}
CGColor プロパティであれば UIDeviceRGBColor も持っているようなので、これを使って新しい UIColor インスタンスを作成すれば、これで渡された値が UIDeviceRGBColor 型のインスタンスであっても無事に、色の値をコピーすることができるようになりました。
… ただし UIColor の場合は、NSString などとは違って、UIMutableColor というような編集可能なインスタンスがなさそうなので、もしかするとこんな苦労をして copy で持たせる必要性が、そもそもないかもしれません。
[ もどる ]