我正试图像这样设置一个属性 -
-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来说很新,一般不编程)
答案 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
方法。