Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 具有校准值的NSColor与常规颜色的工作原理不同?_Objective C_Cocoa - Fatal编程技术网

Objective c 具有校准值的NSColor与常规颜色的工作原理不同?

Objective c 具有校准值的NSColor与常规颜色的工作原理不同?,objective-c,cocoa,Objective C,Cocoa,我在视图中使用一种方法来设置颜色,在awakeFromNib中,我使用 [校准后的NSColor COLOR颜色:绿色:蓝色:α:] 应用程序不断崩溃,错误为“[NSCFNumber set]无法识别的选择器” 插入断点后,我发现它正在将我的变量定义为“NSCalibratedRGBColor”。当我使用一种方便的方法(blueColor、whiteColor等)定义颜色时,应用程序工作了。我以为这只是设置RGB值的快捷方式。我不知道为什么我以前没有遇到过这个问题,我经常使用这样的颜色。为什么它

我在视图中使用一种方法来设置颜色,在awakeFromNib中,我使用 [校准后的NSColor COLOR颜色:绿色:蓝色:α:]

应用程序不断崩溃,错误为“[NSCFNumber set]无法识别的选择器” 插入断点后,我发现它正在将我的变量定义为“NSCalibratedRGBColor”。当我使用一种方便的方法(blueColor、whiteColor等)定义颜色时,应用程序工作了。我以为这只是设置RGB值的快捷方式。我不知道为什么我以前没有遇到过这个问题,我经常使用这样的颜色。为什么它会以不同的方式处理这个问题,我能让它把它解释成一种普通的颜色吗

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

导致问题的代码行是什么

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

然而,我从来没有在NSColor方法的这个特殊用法上看到过这个错误,没有进一步的信息,我只能挠头了

应用程序不断崩溃,错误为“[NSCFNumber set]无法识别的选择器”

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


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

命名颜色,如+[NSColor blueColor]是单例对象。但是+[NSColor COLORORWITHCALIBRED:…]不是。听起来你没有很好地保留颜色


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

行是:[self-setLineColor:[NSColor color withcalibratedred:green:blue:alpha];在我的awakeFromNib中。我还发现,正是非1 alpha值导致将颜色定义为“NSCalibratedRGBColor”(让我继续评论)…Alpha值为1,与便利方法一样,会导致在调试中定义颜色“NSCachedRGBColor”,这完全正常。有什么建议吗?实际上,Peter Hosey是对的。缓存的RGB颜色已经保留了一个引用(因此“缓存”名称),因此您的setLineColor方法可能没有保留正在保存的颜色。非常感谢,正如其他人所建议的,我刚刚打开了垃圾收集。它现在可以工作了。:)