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 で持たせる必要性が、そもそもないかもしれません。

[ もどる ]