46

我有非常大的图形 Mac 应用程序,现在我在 10.9 GM 的控制台中收到很多以下消息。

<Error>: Error: this application, or a library it uses, has passed an invalid numeric value (NaN, or not-a-number) to CoreGraphics API. This is a serious error and contributes to an overall degradation of system stability and reliability. This notice is a courtesy: please fix this problem. It will become a fatal error in an upcoming update.

我注意到这些消息在调用 [NSApp nextEventMatchingMask: untilDate inMode: dequeue] 后出现在调试器中,但我认为原因在其他一些地方。但是我有太多地方使用 Cocoa Graphics。我在 10.9 之前没有收到这种消息。

如何检测 NaN 传递给 CoreGraphics API 的位置?

控制台上此错误的屏幕截图

4

5 回答 5

123

经过大量挖掘,我发现您可以在 Xcode 中的“CGPostError”上设置一个符号断点,这将为您提供堆栈跟踪。

于 2013-11-08T04:00:43.150 回答
7

当我愚蠢地保留一个 NSPopover 以备将来使用时,我遇到了这个错误。

这似乎popover.showRelativeToRect(_:)是您需要做的所有事情,然后您就可以忘记它。

于 2016-03-02T09:18:48.100 回答
5

在为. UIView_.zeroPDFView

这个

var pdfView = PDFView(frame: .zero)

将从问题中生成许多相同的日志。我使用.zero, 的原因是因为后来我设置了带有约束的视图。这被证明是一个问题。解决方案是在初始化PDFView.

var pdfView = PDFView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
于 2020-05-29T11:56:35.533 回答
1

我发现了问题。它在某个点被零除,导致 NSAffineTransform 与矩阵中的 NaN 元素。由于某些原因,编译器和操作系统在 10.9 之前通过了这种情况。

于 2013-10-04T20:03:34.887 回答
0

所以你应该在那个时候得到一个异常,所以一个异常断点应该工作......

这里有一些事情要注意...

您可能弄乱了方法签名...即

-(float)myHeight
{
    return 56.0;
}

在子类中搞砸了

-(int)myHeight
{
    return 42;
}

或者你有一些不好的数学会发出一个 NaN ......

有几种方法可以检测 NaN ... c99isnan()
还介绍了 ieee float 技巧,(f != f)对于 NaN 将是正确的

于 2013-10-04T19:10:20.563 回答