【问题标题】:CGPDFDocumentCreateWithURL ARC Memory LeakCGPDFDocumentCreateWithURL ARC 内存泄漏
【发布时间】:2012-10-05 04:39:31
【问题描述】:

我想在 iOS 上呈现 PDF,但在调用 CGPDFDocumentCreateWithURL() 时出现内存泄漏。我知道这个问题之前已经讨论过,但不知道我的情况是否不同,因为我使用的是 ARC。

我通过在我的 viewDidLoad 上运行以下代码提取并简化了问题:

// Bridge resourceRef to ARC with no ownership change (still owned by ARC)
CFURLRef resourceRef = (__bridge CFURLRef) [NSURL fileURLWithPath:htmlPath];

CGPDFDocumentRef pdf;
pdf = CGPDFDocumentCreateWithURL(resourceRef);
CGPDFDocumentRelease(pdf);

// Do not need to release resourceRef because ARC will release it

Instruments 告诉我泄漏的对象是一个 Malloc 48 字节,由 CoreGraphics 负责。堆栈跟踪中有 CGPDFDocumentCreateWithURL 。泄漏意味着存在没有所有者的对象。

我创建了一个 git repo 并复制了问题: https://github.com/indika/PDFLeaks

任何想法。将不胜感激任何帮助或“指针”。

【问题讨论】:

  • 我可能已经找到泄漏背后的原因:如果我的 PDF 来自 NSCachesDirectory 目录,那么就会发生泄漏。也许我应该为可下载的内容使用不同的目录。
  • 我可能错了,泄漏取决于 pdf 所在的目录
  • 我从您的链接运行了该项目,但它显示没有泄漏...

标签: objective-c ios pdf memory-leaks core-graphics


【解决方案1】:

resourceRef 将被过度释放。看看你在做什么。

1) 将 resourceRef 桥接到 ARC,但所有权没有变化(仍归 ARC 所有)

2) CFReleaseresourceRef

3) ARC 还发布了resourceRef

您不需要第 2 步

这不是内存泄漏,而是过度释放。

【讨论】:

    【解决方案2】:

    我犯了很多错误,尤其是在双重发布文档参考时。然而,在我的情况下,这并不是真正的小动物。

    我正在加载一个损坏的 PDF!我正在使用 pdftk 来分割和合并 pdf 文档,并且我正在破坏索引。所以请记住,在将 PDF 与 pdftk 合并后,使用以下命令修复文件:

    pdftk original output destination
    

    【讨论】:

      猜你喜欢
      • 2012-04-03
      • 2012-09-14
      • 1970-01-01
      • 2017-10-03
      • 2013-08-19
      • 1970-01-01
      • 2011-10-23
      • 2014-04-03
      • 1970-01-01
      相关资源
      最近更新 更多