我们遇到了一个奇怪的崩溃,其中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 而遭遇了一些崩溃,因此这个 bug 还没有被修复。我编写了一个测试应用程序,下载了我们的应用程序可能显示的超过16,000张图片,所有图片都能够顺利地下载并保存到磁盘中,没有问题。一些对这个gist的回应暗示着这个问题可能是由于损坏的图像引起的,但是考虑到我已经下载了超过16,000张图片,并且从来没有出现过问题,我觉得这不可能是原因。
我目前正在研究的最新假设是,下载的数据某种方式受到损坏,因此会创建一个损坏的 UIImage。然而,所有尝试创建损坏的 UIImage 的尝试都失败了。苹果似乎已经为 UIImage 创建了一个健壮的构造函数,因此,任何我传递的无效参数都会返回构造函数的 nil。
有其他人从 UIImagePNGRepresentation 中经历过类似的情况吗?