iOS16+下PDFPage(image:)触发EXC_BAD_ACCESS崩溃的解决求助
iOS 16及以上版本PDFPage初始化崩溃问题
问题现象
相同代码在iOS 16以下版本运行正常,但在iOS 16及以上版本触发崩溃,崩溃点位于PDFPage(image: errorView)初始化语句。
崩溃代码片段
if let errorView = getErrorImageView(), let page = PDFPage(image: errorView) { // <- 此处发生崩溃 page.addAnnotation(getTitlePDFAnnotation()) let count = pdfDocument?.pageCount ?? 0 pdfDocument?.insert(page, at: count) } func getErrorImageView() -> UIImage? { let errorView = UIView() errorView.bounds = view.bounds errorView.backgroundColor = .athenaWhite let errorTitleLabel = UILabel() errorTitleLabel.translatesAutoresizingMaskIntoConstraints = false errorTitleLabel.text = "Error" errorTitleLabel.textAlignment = .center errorView.addSubview(errorTitleLabel) // .... 已为视图添加约束 let renderer = UIGraphicsImageRenderer(size: view.bounds.size) let image = renderer.image { _ in errorView.drawHierarchy(in: errorView.bounds, afterScreenUpdates: true) } return image }
已尝试的排查操作
- 相同代码在其他项目中运行正常,仅当前客户项目触发崩溃
- 确认
getErrorImageView()返回的图片不为nil - 尝试替换为xcasset中的静态图片
- 尝试移除图片的alpha通道
- 启用Zombie Objects调试未发现问题
崩溃日志
Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) #0 0x000000012084d25f in CGBlitInternal::cgsBufferIsConstantValue_internal::TestLimits<unsigned char, 64ul>::operator()(unsigned char const*, unsigned long, CGBlitInternal::cgsBufferIsConstantValue_internal::Limits const&) () #1 0x0000000120b89921 in bool CGBlitInternal::cgsBufferIsConstantValue_internal::TestLimitsRow<unsigned char>(void const*, unsigned long, CGBlitInternal::cgsBufferIsConstantValue_internal::Limits const&) (.10518) () #2 0x0000000120b8969d in bool CGBlitInternal::CGBufIsConstantValue<(CGBlitVariant)0>(CGBuf const*, float const*, float const*) () #3 0x0000000120ba7fe4 in is_image_alpha_opaque () #4 0x0000000120ba7bb8 in create_jpeg_copy () #5 0x0000000120bbd1df in pdf_DrawImage () #6 0x0000000120ad32b8 in CGContextDrawImageWithOptions () #7 0x00000001207e2ad2 in CGPDFPageCreateWithImage () #8 0x000000012b9c9e44 in +[PDFPage _createPageRefFromImage:andOptions:] () #9 0x000000012b9c38dd in -[PDFPage initWithCGImage:options:] () #10 0x000000012b9c476f in -[PDFPage initWithImage:options:] () #11 0x000000012b9c45ae in -[PDFPage initWithImage:] () #12 0x000000010502f913 in @nonobjc PDFPage.init(image:) () #13 0x0000000105025232 in PDFPage.__allocating_init(image:) ()
可行解决方向
从崩溃栈分析,问题出在CoreGraphics层检测图片alpha通道的逻辑中,推测iOS 16后PDFKit对图片格式的校验逻辑更严格,可尝试以下方案:
- 强制生成不透明图片:修改
UIGraphicsImageRenderer配置,指定不透明格式:
let format = UIGraphicsImageRendererFormat() format.opaque = true format.scale = UIScreen.main.scale let renderer = UIGraphicsImageRenderer(size: view.bounds.size, format: format)
- 转换图片为JPEG格式:借助JPEG无alpha通道的特性绕过校验:
if let image = getErrorImageView(), let jpegData = image.jpegData(compressionQuality: 1.0), let jpegImage = UIImage(data: jpegData) { guard let page = PDFPage(image: jpegImage) else { return } // 后续页面插入逻辑 }
- 直接通过PDFContext生成页面:跳过图片转PDFPage的步骤,直接在PDF上下文绘制视图内容。
内容的提问来源于stack exchange,提问作者ShashiKant_B
相关产品推荐
相关产品推荐

