【问题标题】:CGContextDrawPDFPage crashing without ever producing a memory warningCGContextDrawPDFPage 在没有产生内存警告的情况下崩溃
【发布时间】:2012-03-19 05:17:42
【问题描述】:

我正在尝试渲染一个带有一些注释的 PDF 页面(发送到电子邮件),而且大多数情况下它都可以正常工作。

但是,尤其是这个PDF,它似乎每次在第一页调用 CGContextDrawPDFPage 时都会崩溃。我已经添加了

CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
CGContextSetRenderingIntent(context, kCGRenderingIntentDefault);

作为CGContextDrawPDFPage taking up large amounts of memory 的建议,但这似乎并没有解决我的问题。

我通过分析器运行它以查看发生了什么,它慢慢开始分配一堆内存,直到最终达到 512MB 的活动字节并死亡。

奇怪的是,当我将它渲染到图像(用于在设备上显示)上下文时,它似乎工作正常,但是当我将它渲染到 PDF 上下文(用于带注释的电子邮件)时,它会中断。我尝试过的所有其他 PDF 在这两种情况下都可以正常工作。

我希望编写 PDF 查看器/注释器的人可以测试一下,看看这个文档是否适合他们,如果适合,请给我一些提示,告诉我他们正在做些什么来减少 CGContextDrawPDFPage 的内存分配。

我查看的另一个资源是这个很棒的SO Question.

编辑(有关崩溃的更多信息):

在 90% 的情况下,崩溃实际上并没有出现,gdb 行会显示,但应用程序会消失并且堆栈跟踪不会显示。 (它说暂停但没有线程显示)。有一次我看到它是一个 exc_bad_access,它在日志中显示了这一点:

malloc: *** mmap(size=16777216) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug

【问题讨论】:

  • 我添加了关于崩溃的编辑。

标签: ios memory-management instruments cgpdfdocument


【解决方案1】:

您是在主线程上构建 PDF 吗?如果是这样,您可能不会收到内存警告,因为您在执行时阻止了信号,因为运行循环永远没有机会向您发送消息。

【讨论】:

  • 是的,现在它在主线程上。如果我要线程化它并收到警告,那么我该怎么做才能解决这个问题,因为只有一次调用会导致内存用完?
  • @PhilippeSabourin 我在 10.6.8 的 Instruments 中查看了 PDF。 PDF 的绘图或系统框架有问题。包括缩略图,在预览中打开文件总共需要超过 10 GB - 它正在创建大量图像(可能来自矢量图形?)。我无法充分理解原始 PDF 文件格式以查看发生了什么,我也没有一个好的 PDF 编辑器来查看该文件的内容(除非它是 CGPDF 实现中的一些不寻常问题)。问题不在于您的实施 =)
  • @PhilippeSabourin 如果您是该文件的创建者,请尽量减少这种影响,但我也建议向 Apple 提交一个错误。
  • 据我了解,他是在渲染而不是构建 PDF。
  • 是的,这不是我们创建的 PDF,只是有人用来测试我们的应用程序。您可以导入 PDF,然后在其上绘图,然后将其作为带有注释的 PDF 通过电子邮件发送回来。
【解决方案2】:

去掉xcode中的异常断点,就可以正常工作了。

【讨论】:

  • 这会在释放模式下崩溃并出现内存不足错误,不确定删除断点会有什么帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
  • 2016-06-17
  • 2013-04-27
  • 2014-10-30
  • 1970-01-01
  • 2022-10-13
  • 2011-10-15
相关资源
最近更新 更多