【问题标题】:NSColor with calibrated values works differently than regular color?具有校准值的 NSColor 与常规颜色的工作方式不同?
【发布时间】:2009-02-21 02:41:54
【问题描述】:

我在视图中使用一种方法来设置颜色,在 awakeFromNib 中我使用 [NSColor colorWithCalibratedRed: 绿色: 蓝色: alpha:]

应用程序不断崩溃,出现“[NSCFNumber set] unrecognized selector”错误。 插入断点后,我发现它正在将我的变量定义为“NSCalibratedRGBColor”。当我使用一种方便的方法(blueColor、whiteColor 等)定义颜色时,该应用程序工作。我认为这些只是设置 RGB 值的捷径。我不知道为什么我以前没有遇到过这个问题,我经常使用这样的颜色。为什么它的处理方式不同,我可以让它解释为常规颜色吗?

编辑: 代码是: [self setLineColor:[NSColor colorWithCalibratedRed:green:blue:alpha];在我的 awakeFromNib 中。我还发现它是一个非 1 的 alpha 值,导致颜色被定义为“NSCalibratedRGBColor”。 Alpha 值 1 与便捷方法一样,会导致在调试中将颜色定义为“NSCachedRGBColor”,这完全可以正常工作。

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    应用程序不断崩溃,出现“[NSCFNumber set] unrecognized selector”错误。

    这意味着你过度释放了颜色,然后另一个对象(在本例中为 NSNumber)被分配给同一个指针。然后您将set 消息发送到您认为是您的颜色的对象,但它现在实际上是一个 NSNumber 对象。结果:那个错误。这与您使用校准与未校准的色彩空间无关。

    所有颜色都支持相同的 NSColor 接口。您看到的 NS[snip]Color 类是 NSColor 的私有子类;它们都支持所有 NSColor 的方法。就你而言,它们都只是 NSColors。

    【讨论】:

    • 非常感谢,正如其他人建议的那样,我刚刚打开了垃圾收集。现在可以了。 :)
    【解决方案2】:

    像 +[NSColor blueColor] 这样的命名颜色是单例对象。但是 +[NSColor colorWithCalibratedRed:...] 不是。听起来您没有正确保留颜色。

    请务必阅读有关保留/释放的内存管理文档。或者只是切换到垃圾收集。

    【讨论】:

      【解决方案3】:

      导致问题的代码行是什么?

      NSCalibratedRGBColor 与未校准颜色的工作方式不同,因为当您“设置”它时,颜色将校准到上下文的色彩空间,而不是使用原始未校准颜色。

      但是,我从来没有在 NSColor 方法的这种特殊用法上看到过这个错误,而且没有更多信息,我只能摸不着头脑。

      【讨论】:

      • 行是:[self setLineColor:[NSColor colorWithCalibratedRed:green:blue:alpha];在我的 awakeFromNib 中。我还发现它是一个非 1 的 alpha 值,它导致颜色被定义为“NSCalibratedRGBColor”。 (让我继续评论)...
      • Alpha 值为 1,与便捷方法一样,会导致在调试中将颜色定义为“NSCachedRGBColor”,这完全可以正常工作。有什么建议吗?
      • 实际上,Peter Hosey 是对的。缓存的 RGB 颜色已经保留了一个引用(因此称为“缓存”名称),因此您的 setLineColor 方法可能没有保留它正在保存的颜色。
      猜你喜欢
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      • 2023-01-26
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多