png_error内部UIImagePNG仅在iOS 5.1+上表示



我们遇到了一个奇怪的崩溃,UIImagePNGRrepresentation()有时会导致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的崩溃,所以这个错误还没有修复。

我写了一个测试应用程序,下载了我们的应用程序可以显示的16000多个可能的图像,所有这些图像都可以下载并保存到磁盘上,没有任何问题。对这一要点的一些回应暗示,这个问题可能是由损坏的图像引起的,但鉴于我下载了16000多张图像,而且从未出现过问题,我认为情况不可能如此。

我正在研究的最新假设是,下载的数据不知何故被破坏了,因此正在创建一个被破坏的UIImage。但是,所有创建损坏UIImage的尝试都失败了。苹果似乎已经为UIImage创建了一个强大的构造函数,这样我传递的任何无效内容都会导致构造函数返回一个nil。

UIImagePNGRrepresentation有没有其他人经历过类似的事情?

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

您是否从辅助线程进行任何UIKit调用?我见过UIKit图形调用在辅助线程上工作时崩溃,但主线程稍后会崩溃。有一些UIKit方法可以在辅助线程中使用,但并不多。

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

在我的案例中,错误的实际用户效果是图像只能部分渲染;图像的其余部分只是呈现灰色和损坏。我正在使用核心数据存储和读取磁盘(但核心数据令人震惊地不是我的问题)。

我的修复:

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

UIImage *image = [UIImage imageWithContentsOfFile:imagePath];

但根据这里其他一些相关帖子的建议,我转而使用这种方法的组合:

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

它似乎解决了我的问题!

我的理论

我猜,由于某种原因,imageWithContentsOfFile:在处理一些非原子边缘情况方面比纯基NSData调用更差,而且出于某种原因,它允许在前一个"写入"完成之前开始"读取"。

希望这能有所帮助!祝你好运

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

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

大约有25张图片触发了此次坠机事件。我们意识到,这些图像中的每一张都是从Photoshop导出的,而我们的大多数图像都是从Illustrator导出的。在我们尝试的每一个其他程序中,图像都表现得很好,但我们始终无法确定它们的"问题"所在。但我们重新导出了Illustrator的图像,我们这次崩溃的发生率为零。

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

相关内容

  • 没有找到相关文章

最新更新