我们遇到了一个奇怪的崩溃,其中 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 经历过这样的事情?