每当我旋转一个包含UITableView
的屏幕时,我都会看到这种情况发生。我发现它发生在UIViewController
类的willRotate
方法和didRotate
方法之间。我的同事们也在其他地方看到过它,通常都与旋转有关。直到最近才开始出现这种情况,我们还不知道该如何处理它(谷歌搜索没有准确的错误信息)。是否有其他人遇到过这种情况并知道如何解决?
每当我旋转一个包含UITableView
的屏幕时,我都会看到这种情况发生。我发现它发生在UIViewController
类的willRotate
方法和didRotate
方法之间。我的同事们也在其他地方看到过它,通常都与旋转有关。直到最近才开始出现这种情况,我们还不知道该如何处理它(谷歌搜索没有准确的错误信息)。是否有其他人遇到过这种情况并知道如何解决?
决定将此评论作为答案发布,因为我认为这是一个非常出色的答案 :)
哈!我也遇到了NaN计算(div0)。关键的调试工具:输出问题的消息是由NSLog()输出的,所以在NSLog()上设置断点,观察操作系统在那个时候正在做什么。对我而言,是myUISlider.value = NaN。
设置断点:
XCode 3.x
XCode 4.x
XCode 5.x - 7.1(至少) (与4.x相同,只是断点导航器现在是CMD-7。)
运行应用程序,在NSLog上中断,检查堆栈跟踪。
我找到了问题所在。
当你重置tableview
的框架时,它会为表格中的每一行调用委托方法tableView:heightForRowAtIndexPath:
,这样它就可以在需要时重新计算内容大小。此时,我们进行一些特殊处理来返回高度,由于代码中存在一些错误的假设,我们错误地返回了NaN
,因为变量被假定永远不为零而进行了除以零的操作。确保我们在这里不会除以零就可以解决问题。
在启用Xcode的“异常中断”之后,我花了一天时间尝试查找导致同样问题的代码,并在几分钟内解决了它。查看此教程以了解如何启用它。
我曾经遇到过这个问题,当时我假设:
tableView:heightForHeaderInSection:
返回的是一个 NSInteger
,但实际上它返回的是一个 CGFloat
...
修改为:
-(NSInteger)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
< p > 到 -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
问题已经解决。
编辑:
我在某个时刻学会了如何理解C语言以下的计算机工作原理,因此我想分享一下...(我将使用x86_64的寄存器名称,因为我对这些最熟悉,ARM会有些不同但类似)
int f(){
float someFloat=5.0f;
return someFloat;
}
将someFloat
的值转换为整数类型,然后将其复制到特定寄存器:%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风格结构体的值是否被正确初始化。
yourTableview?.bounces = false
。这对我有效。
CALayer position contains NaN
错误导致程序终止并抛出了一个NSException
异常。通过设置异常断点:All Exceptions,我得到了堆栈跟踪信息。(符号断点:NSLog
并没有提供相应信息。) - Warren Whipple