首先是我的崩溃日志:
线程0崩溃:
0 libSystem.B.dylib 0x35176264 __kill + 8
1 libSystem.B.dylib 0x35176254 kill + 4
2 libSystem.B.dylib 0x35176246加注+ 10
3 libSystem.B.dylib 0x3518ad02 abort + 50
4 libstdc ++。6.dylib 0x31432a20 __gnu_cxx :: __ verbose_terminate_handler()+ 376
5 libobjc.A.dylib 0x31a97594 _objc_terminate + 104
6 libstdc ++。6.dylib 0x31430df2 _ cxxabiv1 :: _terminate(void(*)())+ 46
7 libstdc ++。6.dylib 0x31430e46 std :: terminate()+ 10
8 libstdc ++。6.dylib 0x31430f16 __cxa_throw + 78
9 libobjc.A.dylib 0x31a964c4 objc_exception_throw + 64
10 CoreFoundation 0x361857c2 + [NSException raise:format:arguments:] + 62
11 CoreFoundation 0x361857fc + [NSException raise:format:] + 28
12 QuartzCore 0x3148b222 CALayerSetPosition(CALayer *,CA :: Vec2 const&,bool)+ 134
13 QuartzCore 0x3148b190 - [CALayer setPosition:] + 32
14 QuartzCore 0x3148b0dc - [CALayer setFrame:] + 384
15 UIKit 0x35d15aba - [UIView(Geometry)setFrame:] + 182
16 UIKit 0x35d15928 - [UIImageView setFrame:] + 96
我已从崩溃日志中复制了一部分。第16行之后有我的课程,我不能在这里介绍。在MyClass和MyMethod中,我更改了imageView的框架。我的问题是我无法重现这个错误,我想重现它。是什么导致这个日志?我在调用setFrame:之前尝试释放imageView,但它不会产生此错误。 任何想法如何得到它?或者为什么这个错误会发生一次?
答案 0 :(得分:8)
我从自己的一个项目中认识到了这个问题。通常当setFrame:
崩溃时,因为您尝试设置NaN(非数字)。我不知道您之前是否曾经与NaN打过交道,但如果您没有发表评论,我会提供有关如何处理它的信息。
编辑:有一段时间,我想我可以举个例子。
所以这里有一个代码示例来解释为什么这个bug难以重现以及如何解决它。我不知道你的代码是什么样的,但是你的问题听起来很相似,让我相信你犯了同样的错误。
请考虑以下代码:
- (void)layoutSubviews {
CGRect imageFrame;
switch (self.state) {
case 0:
imageFrame = CGRectMake(0, 0, 100, 100);
case 1:
imageFrame = CGRectMake(10, 10, 50, 50);
}
self.imageView.frame = imageFrame;
}
考虑self.state
为2,然后imageFrame
永远不会被初始化,并且将包含该内存位置上的任何内容,可能是NaN。难以重现的原因是只有在该内存位置有NaN时才会发生崩溃。
在我的示例中,错误很容易发现,并且很可能在代码中发现它并不容易。如果您自己找不到,请随时发布您的代码,我会看看它。如果您有任何疑问,请随时发表评论。