10

我们遇到了一个奇怪的崩溃,其中 UIImagePNGRepresentation() 有时会导致 png_error 调用。我们无法在我们内部的任何设备上重现此错误。

以下是我们的 HockeyApp 崩溃日志之一的堆栈跟踪示例:

Thread 0 Crashed:
0   libsystem_kernel.dylib         0x3167132c __pthread_kill + 8
1   libsystem_c.dylib              0x33d6729f abort + 94
2   ImageIO                        0x346c38bf png_error + 114
3   ImageIO                        0x346c2fe3 png_write_end + 46
4   ImageIO                        0x346bf069 writeOnePng + 2260
5   ImageIO                        0x346be78b _CGImagePluginWritePNG + 82
6   ImageIO                        0x346be6fd CGImageDestinationFinalize + 132
7   UIKit                          0x31346e23 UIImagePNGRepresentation + 274

我们只在运行 iOS 5.1+ 及更高版本的设备上看到此崩溃日志。我们实际上也遇到了来自 iOS 6 的崩溃,所以这个错误还没有得到修复。

我编写了一个测试应用程序,它下载了我们的应用程序可以显示的超过 16,000 张可能的图像,并且所有这些图像都能够毫无问题地下载并保存到磁盘中。对这个要点的一些回应暗示这个问题可能是由损坏的图像引起的,但看看我如何下载超过 16,000 张图像并且从未遇到过问题,我认为情况并非如此。

我正在研究的最新假设是,正在下载的数据以某种方式损坏,因此正在创建损坏的 UIImage。但是,所有创建损坏的 UIImage 的尝试都失败了。Apple 似乎为 UIImage 创建了一个健壮的构造函数,这样我传入的任何无效的结果都会导致构造函数返回 nil。

有没有其他人从 UIImagePNGRepresentation 经历过这样的事情?

4

5 回答 5

0

如果调用UIImagePNGRepresentation在循环内,我看到另一个SO 线程上的修复建议sleep(1.0);在保存后添加。

于 2013-05-27T07:47:32.880 回答
0

在我的生产应用程序(在我的情况下使用)中,几个月来我一直在努力解决类似的本地图像损坏问题,UIImageJPEGRepresentation()在我的情况下,它与下载图像无关 - 但与本地存储和渲染有关。

就我而言,错误的实际用户影响是图像只会部分呈现;图像的其余部分只是显示为灰色和损坏。我正在使用 Core Data 存储和读取磁盘(但令人震惊的是,Core Data 不是我的问题)。

我的修复:

我以前使用这种方便的方法:

UIImage *image = [UIImage imageWithContentsOfFile:imagePath];

..但是根据此处其他相关帖子的建议,我改用了这种方法组合:

NSData *resultData = [NSData dataWithContentsOfFile:imagePath];
UIImage *image = [UIImage imageWithData:resultData];

..它似乎解决了我的问题!

我的理论

我猜测imageWithContentsOfFile:,由于某种原因,与纯基本调用相比,处理一些非原子边缘情况条件更差NSData,并且出于某种原因允许在前一个“写入”完成之前开始“读取”。

希望这可以帮助!祝你好运。

于 2012-12-25T09:46:18.380 回答
0

您是否尝试过使用不同的网络条件进行测试?3G 或边缘,而不仅仅是 wifi?尝试使用网络链接调节器来模拟这些缓慢和有损网络的情况。

于 2012-09-17T15:44:04.133 回答
0

您是否从辅助线程进行任何 UIKit 调用?我已经看到了 UIKit 图形调用在辅助线程上工作但主线程在稍后的某个时候崩溃的崩溃。有一些 UIKit 方法可以在辅助线程上使用,但并不多。

于 2012-09-20T03:27:21.650 回答
0

我们在大规模运行的应用程序中遇到了这个问题。它每天发生超过1000次。使用 Crashlytics 中的日志记录功能,我们能够准确确定导致崩溃的图像。

大约有 25 张图像触发了崩溃。我们意识到这些图像中的每一张都是从 Photoshop 中导出的,而我们的大多数图像都是从 Illustrator 中导出的。在我们尝试过的所有其他程序中,图像都呈现得很好,我们永远无法确定它们的“错误”是什么。但是我们从 Illustrator 重新导出了图像,我们这次崩溃的发生率降为零。

我意识到这并不能提供根本原因,但认为它可能对其遇到此问题的其他人有所帮助。

于 2013-11-18T17:22:00.457 回答