尝试设置框架时 UIImageView 崩溃

Posted

技术标签:

【中文标题】尝试设置框架时 UIImageView 崩溃【英文标题】:UIImageView crash when trying to set the frame 【发布时间】:2011-03-14 07:44:33 【问题描述】:

首先这是我的崩溃日志:

线程 0 崩溃: 0 libSystem.B.dylib 0x35176264 __kill + 8 1 libSystem.B.dylib 0x35176254 杀死 + 4 2 libSystem.B.dylib 0x35176246 提升 + 10 3 libSystem.B.dylib 0x3518ad02 中止 + 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,但它不会产生此错误。 任何想法如何得到它?或者为什么有时会出现这个错误?

【问题讨论】:

如果没有看到任何代码,这有点难以分辨。但是,如果它不可重现,我会说这可能是内存问题。检查您是否正确管理了所有保留计数。使用仪器测试应用程序的泄漏也可能很有用。 如果您无法重现您的代码,如您所说,那么除了崩溃日志之外的任何其他内容都很难帮助您解决问题。从检查您如何设置UIImageView 的框架开始,然后从那里向后工作。 这很糟糕,因为我试图强制释放 imageView,应用程序在 setFrame: 处崩溃,但没有此日志。为什么它会在此日志中显示 [NSException raise:format:]?你们有什么想法吗? 【参考方案1】:

我从我自己的一个项目中认识到了这个问题。通常当setFrame: 崩溃时,这是因为您尝试设置 NaN(不是数字)。我不知道你以前是否处理过 NaN,但如果你没有发表评论,我会提供有关如何处理它的信息。

编辑:有时间想我可以给你举个例子。

所以这里有一个代码示例来解释为什么该错误难以重现以及如何修复它。我不知道你的代码是什么样的,但你的问题听起来很相似,让我相信你犯了和我一样的错误。

考虑以下代码:

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

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

【讨论】:

以上是关于尝试设置框架时 UIImageView 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

UIImageView 没有动画

在 UIImageview 上覆盖 UIImageview 保存

Playground,无法将同一个 UIImageView 设置为多个 UIView

使用 UITableViewAutomaticDimension 时 UIImageView 拉伸不正确

UIImageView 上的按钮不可点击

尝试通过 viewWithTag 获取 UIImageView 引用后崩溃