Xcode关于CoreGraphics数值为NaN的报错问题
Xcode关于CoreGraphics数值为NaN的报错问题

Xcode关于CoreGraphics数值为NaN的报错问题

Xcode中发现输出如下报错:

Error: this application, or a library it uses, has passed an invalid numeric value (NaN, or not-a-number) to CoreGraphics API and this value is being ignored. Please fix this problem.
If you want to see the backtrace, please set CG_NUMERICS_SHOW_BACKTRACE environmental variable.

经过查询了解到这个说明传给 CoreGraphics(苹果的绘图系统)的数值是非法的:NaN(Not-a-Number),比如:0.0 / 0.0、sqrt(-1)、log(-10),还有任何未初始化的 Double、CGFloat,或非法计算值。

实际上这个报错并没有什么影响,可能会导致折线图显示有问题。

问题原因

具体来讲就是,存在一个数值为NaN,在绘图过程中,有个数字是 NaN(不是一个有效数字),比如 CGPoint(x: NaN, y: 100)。

这类错误通常不会导致程序崩溃,但会导致UI 不正常或图表错位/不显示。

排查方案

因为我这里涉及到一些计算流程,因此主要还是查看被除数为0的问题:

修改代码1:

for userCurrency in userForeignCurrencies {
    if let symbol = userCurrency.symbol, let rate = rateDict[symbol],let localCurrency = rateDict[appStorage.localCurrency]{    // 修改前
        total += userCurrency.amount / rate * localCurrency
    }
}

for userCurrency in userForeignCurrencies {
    if let symbol = userCurrency.symbol, let rate = rateDict[symbol],let localCurrency = rateDict[appStorage.localCurrency] ,rate > 0, localCurrency > 0 {  // 修改后
        total += userCurrency.amount / rate * localCurrency
    }
}

修改代码2:

func normalize(_ value: Double, min: Double, max: Double) -> Double {
    return (value - min) / (max - min)
}

func normalize(_ value: Double, min: Double, max: Double) -> Double {
    guard max != min else { return 0 }		// 新增代码
    return (value - min) / (max - min)
}

排查了很多代码,上面两个示例代码是比较典型的,我通过判断来防治被除数出现为0的情况。

最后重新运行代码,不再报错。

总结

这类问题可能还是影响绘图多一些,如果排查代码很复杂,可以先搁置到后续处理。

后续的开发过程中,在判断代码时,应该考虑到这种场景,通过 > 0等判断防止出现特殊情况。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注