0

ビューのカスタムボタンを作成しようとしています。レンダリングするときを除いて、すべてがうまく機能します。色に関して例外がスローされます。私のクラスには2つの色のプロパティがあります。

@property (nonatomic, retain) UIColor* defaultBackground;
@property (nonatomic, retain) UIColor* clickedBackground;

1つはデフォルトのレンダリング色を表し、もう1つはユーザーがクリックしたときの色を表します。initWithFrameメソッド内で、色を初期化します。

defaultBackground = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
clickedBackground = [UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];

CGColorを取得するときに例外がスローされるレンダリングに到達するまで、これはすべてうまくいきます。

if((self.state & UIControlStateHighlighted) == 0)
    {
        CGContextSaveGState(context);
        CGContextSetFillColorWithColor(context, defaultBackground.CGColor); //Crashes on this line
        ...

これが私が得ている例外です:

2012-04-13 10:19:51.005 -[__NSMallocBlock__ CGColor]: unrecognized selector sent to instance 0x7d94d20
2012-04-13 10:19:51.072 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSMallocBlock__ CGColor]: unrecognized selector sent to instance 0x7d94d20'

任意のアイデアをいただければ幸いです。

4

2 に答える 2

6

次のように、の2行を変更しinitWithFrame:ます。

self.defaultBackground = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
self.clickedBackground = [UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];

問題は、自動解放UIColorされたオブジェクトをivarに直接割り当てると、解放されたオブジェクトへのダングリングポインタが発生することです。別の方法は次のとおりです。

defaultBackground = [[UIColor alloc] initWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
clickedBackground = [[UIColor alloc] initWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];
于 2012-04-13T14:38:41.770 に答える
2

あなたがする必要があります-

self.defaultBackground = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
self.clickedBackground = [UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];

...それ以外の場合、それらは保持されていません。

于 2012-04-13T14:37:50.963 に答える