与我的应用程序集成的Crashlytics报告了一次崩溃:
CALayerInvalidGeometry:CALayer界限包含NaN:[ - 14 nan; 375 0]
我实际上既不能重现崩溃,也无法识别有关可能发生崩溃的控制器类或方法的任何相关信息。 我已经仔细检查了我的应用程序中包含的所有数学,并且还通过StackOverFlow查看了几个相关问题,但无法找到任何解决方案。 任何帮助非常感谢。
答案 0 :(得分:0)
这些非常难以发现,但不幸的是,这看起来像是一些逐个划分的问题。首先,除以零将不会给您NaN
,而是inf
或-inf
。将NaN
除以零的唯一方法是将0.0
除以0.0
。还有其他方式可以NaN
使用acos(2.0)
,因为cos
位于区间[-1,1]。
但最重要的是,NaN
的所有操作都会导致NaN
,这意味着以下内容:
let a: CGFloat = 0.0
let b: CGFloat = 0.0
let c: CGFloat = a/b
let frame = CGRect(x: 14.0, y: 30.0*c, width: 375.0, height: 0.0)
print(frame)
输出(14.0, nan, 375.0, 0.0)
。因此,即使您在30.0*c
中看不到可能除零,您仍然可以在参数c
中将除以零。
我知道遇到一个问题,因为这个问题非常痛苦。您可以通过实施顶级方法来克服它:
func CGRect(x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat) -> CoreGraphics.CGRect {
return CoreGraphics.CGRect(x: x.isNaN ? 0.0 : x, y: y.isNaN ? 0.0 : y, width: width.isNaN ? 0.0 : width, height: height.isNaN ? 0.0 : height)
}
这会将NaN
替换为0.0
,并且最有可能修复崩溃。仍然没有办法说出结果会是什么。你也可以这样做,并在那里添加一些if
语句,并使用断点尝试自己随机重现问题。通过这种方式,您可以找到有关正在发生的事情的更多信息,但您需要能够重现该问题。