尝试从属性获取 CGColor 值会导致崩溃
-
17-09-2020 - |
题
我正在尝试设置这样的属性 -
-界面:
@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);
我发现这是一个更干净的解决方案,因为您不必担心保留或随后释放任何 CGColor
s。事实上,您甚至不必处理任何 Core Graphics 填充颜色设置命令,例如 CGContextSetFillColorWithColor
.
您可以查看 - (void)setFill
更详细的方法在 UIColor 苹果文档.
不隶属于 StackOverflow