我的代码存在问题。我无法将圆圈设置为构造函数中传递的颜色。当它运行时,我收到以下错误," 由于未捕获的异常终止应用' NSInvalidArgumentException',原因:' -CGColor没有为UIColor定义;需要先转换色彩空间。'"这是我的代码
MainViewController.m
#import "CircleGenerator.h"
CircleGenerator *newCircle =[[CircleGenerator alloc]initWithFrame:frame initWithColor:[UIColor blackColor];
CircleGenerator.h
@property(nonatomic, strong) UIColor *circleColor;
- (id)initWithFrame:(CGRect)frame initWithColor:(UIColor*)color;
CircleGenerator.m
- (id)initWithFrame:(CGRect)frame initWithColor:(UIColor *)color
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
_circleColor = [[UIColor alloc]init];
_circleColor = color;
NSLog(@"the color is %@", _circleColor);
}
return self;
}
- (void)drawRect:(CGRect)rect
{
// Init a CGContecRef
CGContextRef context = UIGraphicsGetCurrentContext();
// Makes circle a bit smaller then the rectange to prevent it from getting cut off
CGRect border = CGRectInset(rect, 5, 5);
// Draws circle
CGContextAddEllipseInRect(context, border);
// Changes the color of the line
CGContextSetStrokeColorWithColor(context, [_circleColor CGColor]);
// Sets the line to the appropriate thickness
CGContextSetLineWidth(context, 5.0);
// Draws the circle onto the UIView
CGContextStrokePath(context);
}
我遇到了来自CircleGenerator.m的以下行的问题
CGContextSetStrokeColorWithColor(context, [_circleColor CGColor]);
如果我用[UIColor blackColor]代替_circleColor,代码编译没有任何问题。我的错误做了什么想法?
答案 0 :(得分:1)
替换:
CGContextSetStrokeColorWithColor(context, [_circleColor CGColor]);
使用:
CGColorRef redRef = CFRetain(_circleColor.CGColor);
CGContextSetStrokeColorWithColor(context, [_circleColor CGColor]);
// use redRef and when done release it:
CFRelease(redRef)
修改:
查看此链接如何解决问题Accessing CGThings from NSThings or UIThings
答案 1 :(得分:1)
_circleColor = [[UIColor alloc] init];
这将返回类UIPlaceholderColor的实例,并且可能没有关于制作CGColor所需的颜色空间的信息。
尝试_circleColor = [UIColor clearColor];
您应该使用指定的初始值设定项创建颜色,或使用预设的颜色,如[UIColor blackColor]。
答案 2 :(得分:0)
什么调用你的init构造函数减少了颜色的保留计数。由于您通过直接指定_circleColor来绕过颜色的设置器,因此赋值不会增加保留计数 - 从而导致悬空指针。
将_circleColor = color;
替换为self.circleColor = color;