我正在尝试设置这样的属性 -

-界面:

@property (readwrite, assign) CGColorRef otherBallColor;

-一些方法:

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 来说还很陌生,虽然不是一般的编程)

有帮助吗?

解决方案

必须保留返回的cgcolor,您的[Uicolor ColorWith ...]创建一个自动发布的实例,因此,当它超出范围(自动发布的我的意思)时,也会发布相应的CGColor。

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

其他提示

谈论迟到的答案,但我对这个特定问题有一个替代解决方案,我不久前遇到过这个问题。我在解决方案之前发现了这个问题,所以我想我应该投入两分钱。事实证明 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);

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

您可以查看 - (void)setFill 更详细的方法在 UIColor 苹果文档.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top