试图从属性中获取CGColor值会导致崩溃

时间:2010-07-18 12:03:26

标签: objective-c properties cgcolor

我正试图像这样设置一个属性 -

-interface:

@property (readwrite, assign) CGColorRef otherBallColor;

-someMethod:

CGColorRef ballColor = [UIColor colorWithRed:255.0/256.0 green:165.0/256.0 blue:239.0/256.0 alpha:1.0].CGColor;  
[self setOtherBallColor:ballColor];

一旦我尝试访问该值,它就会崩溃 -

-someOtherMethod(在这种情况下为drawRect):

CGContextSetFillColorWithColor(context, otherBallColor);

但如果在“someMethod”我做 -

CGColorRef ballColor = [UIColor blueColor].CGColor;

......一切正常。谁能解释一下发生了什么?

非常感谢(PS,对Objective-C来说很新,一般不编程)

2 个答案:

答案 0 :(得分:5)

你必须保留返回的CGColor,你的[UIColor colorWith ...]会创建一个自动释放的实例,因此,当它超出范围时(我的意思是自动释放),相应的CGColor也会被释放。

如果在这种情况下我可以使用,我建议您使用UIColor而不是CGColorRef。

答案 1 :(得分:1)

谈论一个迟到的答案,但我有一个替代方案来解决这个问题,我刚才遇到过这个问题。我在解决方案之前找到了这个问题,所以我想我会投入两分钱。事实证明UIColor有一个名为setFill的实例方法,它将接收器设置为当前上下文填充颜色。所以你可以写:

CGContextRef myContext = UIGraphicsGetCurrentContext();
[[UIColor colorWithRed:255.0/255.0 green:165.0/255.0 
                  blue:239.0/255.0 alpha:1.0] setFill];
CGContextFillPath(myContext);

我发现这是一个更清洁的解决方案,因为您不必担心保留或随后释放任何CGColor。实际上,您甚至不必处理任何Core Graphics填充颜色设置命令,例如CGContextSetFillColorWithColor

您可以在UIColor Apple documentation中更详细地查看- (void)setFill方法。