什么原因导致这个错误 “CALayer的立场包含NaN:”
我见过这种情况,只要我旋转一个有UITableView
的屏幕就可以了。 我发现它发生在UIViewController
的willRotate
和didRotate
方法调用之间我的同事也在其他地方看到了它,通常是围绕旋转。 它直到最近才开始发生,我们很难理解我们应该如何处理它(谷歌search没有以确切的forms显示错误信息)。 有没有其他人遇到这个知道该怎么办呢?
(决定把这个出来的意见,并把它作为一个答案,因为我认为这是一个很好的回答:)
哈! 我也有NaN计算(div0)。 关键的debugging帮助:有问题的消息是由NSLog()输出的,所以在NSLog()上设置一个断点,并观察当时的操作系统在做什么。 对我来说,这是myUISlider.value = NaN。
设置断点:
XCode 3.x
- CMD-SHIFT-Y(debugging窗口)
- 断点button。
- “双击符号”
- input“NSLog”(不含引号)。
XCode 4.x
- CMD-6(断点导航器)
- “+”添加断点(左下angular)。
- selectADD SYMBOLIC BREAKPOINT。
- 符号:NSLog
- 确认:完成。
XCode 5.x – 7.1(至less) (与4.x相同,除了断点导航器现在是CMD-7)。
运行应用程序,看看它在NSLog中断,检查堆栈跟踪。
我发现了这个问题。
当您重置tableview
的框架时,它将调用委托方法tableView:heightForRowAtIndexPath:
表中的每一行,以便在需要时重新计算其内容大小。 在这一点上,我们做了一些特殊的处理来恢复高度,由于我们的代码中有一些不好的假设,我们错误地归还了NaN
因为被一个零误差(我们除以的variables被假定为不为零)。 确保我们在这里不除以零。
我花了一天的时间试图find导致相同问题的代码,并在Xcode中启用“打破例外”后的一分钟内解决了这个问题。 查看本教程以了解如何启用它。
我有这个问题,当我以为:
tableView:heightForHeaderInSection:
返回一个NSInteger
,但它返回CGFloat
…
变化:
-(NSInteger)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
至
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
解决了我的问题。
编辑:
在某个时候,我知道计算机是如何在C级以下工作的,所以我想我会分享它…(我将使用来自x86_64的寄存器名称,因为我最熟悉这些寄存器名称,ARM会略有不同,但类似)
int f(){ float someFloat=5.0f; return someFloat; }
导致将someFloat
的值转换为整数types,然后将其复制到特定的寄存器: %rax
然后调用返回指令。
float f(){ float someFloat=5.0f; return someFloat; }
导致将someFloat
的值从其当前位置复制到特定的寄存器: %xmm0
然后调用返回指令。
所以,如果你有错误的原型调用代码会期望值在错误的地方,你最终会真的返回一个垃圾值。
这个错误也花了我很长时间。
最后我发现我的同事写了这样的话:
UIEdgeInsets a; a.left = (...some calculation); button.imageEdgeInsets = a;
我重写了这样的代码并解决了这个问题:
UIEdgeInsets a; a.left = (...some calculation); a.top = 0; a.bottom = 0; a.right = 0; button.imageEdgeInsets = a;
UIEdgeInsets的某些值没有被正确初始化,有时会变成NaN值,导致应用程序崩溃。
更一般地说,你应该检查C风格结构的所有值是否被正确初始化。