【问题标题】:Trying to get the CGColor value from a property causes crash试图从属性中获取 CGColor 值会导致崩溃
【发布时间】:2010-07-18 12:03:26
【问题描述】:

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

-接口:

@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 很新,一般不会编程)

【问题讨论】:

  • 你应该除以 255 而不是 256。

标签: objective-c properties cgcolor


【解决方案1】:

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

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

【讨论】:

  • ... 并使用 CGColorRetain 代替 -retain
  • 谢谢 - 我刚刚尝试过这个版本,包括: UIColor *ballUIColor = [[UIColor colorWithRed:255.0/256.0 green:165.0/256.0 blue:239.0/256.0 alpha:1.0] retain]; [self setOtherBallColor:ballUIColor.CGColor]; [ballUIColor 发布]; ...&当我访问 drawRect 中的值时它仍然崩溃。我有点难过......(也试过自动释放无济于事)
  • 是的,或者(我个人更喜欢)在可能的情况下使用更高级别的对象。 UI/NS 类在大多数情况下看起来更好、更容易阅读并且更容易管理
  • CGColorRetain!谢谢 - 你在哪里找到这些东西?我以为我正在非常彻底地检查文档,但我错过了。我确实想知道我应该如何保留不是 UIColor 之类的对象...
  • 可能也与此有关。这是我的问题,并让我找到了解决方案:cocoanetics.com/2012/06/radar-arc-releases-uicolor-prematurely
【解决方案2】:

谈论一个迟到的答案,但我有一个解决这个特定问题的替代解决方案,我不久前遇到了这个问题。我在解决方案之前发现了这个问题,所以我想我会投入两分钱。原来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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多