尝试设置框架时UIImageView崩溃

时间:2011-03-14 07:44:34

标签: ios4 uiview uiimageview

首先是我的崩溃日志:

  

线程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,但它不会产生此错误。 任何想法如何得到它?或者为什么这个错误会发生一次?

1 个答案:

答案 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时才会发生崩溃。

在我的示例中,错误很容易发现,并且很可能在代码中发现它并不容易。如果您自己找不到,请随时发布您的代码,我会看看它。如果您有任何疑问,请随时发表评论。