应用程序在 CGContext.drawPDFPage 崩溃并出现 EXC_BAD_ACCESS

App crashes on CGContext.drawPDFPage with a EXC_BAD_ACCESS

我的应用程序在 CGContext.drawPDFPage 时随机崩溃,但无法始终如一地重现错误。它主要发生在 iPad 上。代码看起来像这样:

override func draw(_ layer: CALayer, in ctx: CGContext) {

  UIGraphicsPushContext(ctx)
  ctx.saveGState()

  defer {
    ctx.restoreGState()
    UIGraphicsPopContext()
  }

  ctx.setFillColor(UIColor.white.cgColor)
  ctx.fill(viewBounds)

  ctx.translateBy(x: 0, y: viewBounds.height)
  ctx.scaleBy(x: 1, y: -1)
  ctx.scaleBy(x: pdfScale, y: pdfScale)

  ctx.interpolationQuality = .high
  ctx.setRenderingIntent(.defaultIntent)

  ctx.beginPDFPage(nil)
  ctx.drawPDFPage(pdfPage) // This is where the crash happens
  ctx.endPDFPage()
}

堆栈跟踪以 CGPDFObjectGetReference 结尾,看起来像这样:

错误是:EXC_BAD_ACCESS。如果您看到任何可能导致此崩溃的原因,将会对我有很大帮助!

iOS 12

遇到类似崩溃的任何人,情况都在缓存层中,在特定情况下按索引请求 CGPDFDocumentCGPDFPage

解决方案是按需从持久存储中请求 PDF。

iOS 13

从 iOS 13 开始——我们没有看到任何与此相关的错误,因此 Apple 可能通过从 CGPDFDocumentCGPDFPage 类型的值恢复上下文来解决该错误.