Ответ 1
После многократного поиска я обнаружил, что вы можете установить символическую точку останова на "CGPostError" в Xcode, и это даст вам трассировку стека.
У меня очень большое графическое приложение для Mac, и теперь я получаю много следующих сообщений в консоли на 10,9 ГМ.
<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 переходит к API CoreGraphics?
После многократного поиска я обнаружил, что вы можете установить символическую точку останова на "CGPostError" в Xcode, и это даст вам трассировку стека.
Я получал эту ошибку, когда я глупо сохранял NSPopover для будущего использования.
Кажется, что popover.showRelativeToRect(_:)
- это все, что вам нужно сделать, а затем вы можете забыть об этом.
Я нашел проблему. Он делит на нуль в какой-то момент, что приводит к NSAffineTransform с элементами NaN в матрице. По некоторым причинам компилятор и ОС передали эту ситуацию до 10.9.
поэтому вы должны получить исключение в этой точке, поэтому контрольная точка исключения должна работать...
вот что нужно искать...
возможно, вы испортили подпись метода... т.е.
-(float)myHeight
{
return 56.0;
}
запутался в подклассе
-(int)myHeight
{
return 42;
}
или у вас есть плохая математика (ы), которые испускают NaN...
существует несколько способов обнаружения NaN...
c99 введено isnan()
также т.п. т.п. (f != f)
будет истинным для NaN