问题:UIImagePNGRepresentation把png图片写入沙盒中,在某些机型上出现 get CFData Bytes At Offset直接崩溃。
本地的逻辑:下载完一个zip包,解压完后对其中某些图片进行裁剪再写入磁盘,通知软件应用zip包里的图片资源。
分析:下载是在子线程中完成。裁剪图片和写入磁盘及读取图片是在主线程操作的。同一个线程,解压完再写入图片,然后应用,这是没有问题的。而按崩溃的原因是写入图片时的大小和获取时的大小不一致,导致越界导致的。最有可能的原因就是,裁剪完后写入图片,但此时又在读取取图片了,线程不安全导致崩溃。
下面是修改逻辑的伪代码:在子线程裁剪完后写入磁盘后,再去通知应用。

这没有从根本上解决问题,如果图片正在裁剪图片然后写入操作时,用户操作了界面使得程序出现了读取操作,就会出现标题中的崩溃。这个时候,我们应该对图片资源的读写,做一个线程安全的逻辑。避免这种偶现问题的发生。
总结:机型适配的问题,逻辑上是没有错误的。只能说iPhone在某些系统的处理逻辑有点问题,而我们要做的是从根源上解决这个问题来适配所有机型。
网友评论