私は非常に大きなグラフィックMacアプリを持っていますが、10.9GMのコンソールで次のメッセージをたくさん受け取ります。
<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]を呼び出した後、これらのメッセージがデバッガーに表示されることに気付きましたが、理由は他の場所にあると思います。しかし、CocoaGraphicsを使用する場所が多すぎます。私は10.9以前にこの種のメッセージを受け取りませんでした。
NaNがCoreGraphicsAPIに渡されている場所を検出する方法は?
よく調べてみると、Xcodeの「CGPostError」にシンボリックブレークポイントを設定できることがわかりました。これにより、スタックトレースが得られます。
将来の使用のためにNSPopoverを愚かに保持していたときに、このエラーが発生していました。
popover.showRelativeToRect(_:)
だけで十分なようですが、それを忘れることができます。
私は問題を見つけました。ある時点でゼロ除算を行うと、マトリックス内にNaN要素を持つNSAffineTransformが発生します。いくつかの理由で、コンパイラとOSは10.9より前にこの状況を通過しました。
その時点で例外を取得する必要があるため、例外ブレークポイントが機能するはずです...
ここに注意すべきことがあります...
メソッドシグネチャを台無しにした可能性があります...つまり
_-(float)myHeight
{
return 56.0;
}
_
サブクラスでめちゃくちゃになる
_-(int)myHeight
{
return 42;
}
_
または、NaNを放出するいくつかの悪い数学があります...
naNを検出する方法はいくつかあります... c99が導入されましたisnan()
また、_(f != f)
_のieeeフロートトリックはNaNにも当てはまります