CGContextSetFillColorWithColor エラー (EXC_BAD_ACCESS)
-
18-09-2019 - |
質問
なぜこのエラーでアプリがクラッシュするのか混乱しています。
displayLayer メソッド (CALayer をレンダリングするため) を実装しました。このメソッドを初めて実行すると、問題なく動作します。ただし、その後これを呼び出すとエラーが発生します。
このエラーは、self.bgColor がコンテキストの塗りつぶしの色に設定されているときに発生するようです。興味深いことに...その行の直前に bgColor を作成すると、問題は解決します。ただし、現状では、bgColor はこのクラス (displayLayer メソッドのコンテナ) の初期化時に作成されます。
-(void)displayLayer:(CALayer *)caLayer
{
UIGraphicsBeginImageContext(caLayer.frame.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, self.bgColor);
CGContextFillRect(context, CGRectMake(0, 0, 320, 25));
[self drawText:context];
// get image buffer
UIImage *imageBuffer = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// set layer contents to image buffer
caLayer.contents = (id)[imageBuffer CGImage];
}
解決
私はまだ iPhone プログラミングをあまりやったことがなく、CGColor インスタンス変数を使ったこともありません。そのため、私なら次のようにします。
@interface {
....
UIColor *bgColor;
....
}
@property (nonatomic, retain) UIColor *bgColor;
...
@end
@implementation
@synthesize bgColor;
- (id)init {
...
self.bgColor = [UIColor blackColor];
...
}
-(void)displayLayer:(CALayer *)caLayer {
...
CGContextSetFillColorWithColor(context, self.bgColor.CGColor);
...
}
...
@end
[UIColor blackColor] は自動解放されたオブジェクトを返しますが、それを保持せずにインスタンス変数に割り当てました。
init で bgColor だけではなく self.bgColor を使用し、その値を保持するようにプロパティを設定すると、色が確実に保持され、後で displayLayer で使用できるようになります。
前述したように、私は CGColors を直接使用した経験がありません。そのため、上記のコードでは UIColor を使用しています。必要に応じて調整してください。
所属していません StackOverflow