Mac平台Objective-C程序出现Decoding failed with error code -1报错求助
我之前在Mac上做Objective-C项目时也碰到过一模一样的解码错误,结合你给出的日志信息,给你几个实用的排查方向:
先确认数据源是否完整
错误码-1是很通用的解码失败标识,最常见的原因就是要解码的文件或者数据流不完整——比如下载中断、文件损坏,或者读取数据时没读到全部字节。你可以对比正常解码成功的文件和出错文件的大小,或者在读取数据的代码里加个校验,确认实际读取的字节数和预期一致。核对解码参数和数据源格式是否匹配
从日志里的Options: 305x229 [FFFFFFFF,FFFFFFFF] 0001C060能看到解码时的尺寸和配置参数,大概率是你用的解码框架(不管是系统的ImageIO还是自定义解码器)的配置和实际数据源的格式不兼容。比如如果是图像解码,要确认数据源的编码格式(比如PNG的压缩参数、JPEG的颜色空间)和你设置的解码选项是否匹配。排查系统API的兼容性问题
如果你用的是macOS自带的解码API(比如CGImageSource这类),不同系统版本可能有细微的兼容性差异。可以试试在不同版本的macOS上测试,看是不是特定系统才会出问题;另外也检查下API调用时的参数,比如有没有正确设置解码选项字典,有没有遗漏必要的配置。添加更详细的错误日志
你现在的日志只有错误码-1,信息太有限了。如果你的解码API支持NSError,可以在解码失败时捕获更详细的错误信息,比如:NSError *decodeError = nil; id decodedResult = [yourDecoder decodeObjectWithError:&decodeError]; if (!decodedResult) { NSLog(@"详细解码错误:%@", decodeError.localizedDescription); NSLog(@"错误域:%@,错误码:%ld", decodeError.domain, (long)decodeError.code); }这样能得到比-1具体得多的原因,比如是格式不支持、内存不足还是参数错误。
做最小复现测试
把出问题的数据源单独抽出来,写一个只做解码操作的小测试程序,看能不能复现错误。如果能,就可以排除项目中其他代码的干扰,专注排查数据源本身或者解码逻辑的问题;如果不能,那大概率是项目里的其他代码(比如多线程冲突、内存管理问题)影响了解码过程。
内容的提问来源于stack exchange,提问作者Cope

