You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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对图片格式的校验逻辑更严格,可尝试以下方案:

  1. 强制生成不透明图片:修改UIGraphicsImageRenderer配置,指定不透明格式:
let format = UIGraphicsImageRendererFormat()
format.opaque = true
format.scale = UIScreen.main.scale
let renderer = UIGraphicsImageRenderer(size: view.bounds.size, format: format)
  1. 转换图片为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 }
    // 后续页面插入逻辑
}
  1. 直接通过PDFContext生成页面:跳过图片转PDFPage的步骤,直接在PDF上下文绘制视图内容。

内容的提问来源于stack exchange,提问作者ShashiKant_B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 11:57:46