2012-10-15 75 views
0

我想在iOS上呈现PDF,当我拨打CGPDFDocumentCreateWithURL()时,我得到内存泄漏。我知道这个问题之前已经讨论过,但我不知道我的情况是否因为我使用ARC而不同。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 

仪器告诉我说,泄漏的对象是一个malloc 48个字节,由CoreGraphics中负责。堆栈跟踪里面有CGPDFDocumentCreateWithURL。泄漏意味着在没有业主的情况下有物体存在。

我已经创建一个混帐回购协议的问题的复制: https://github.com/indika/PDFLeaks

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

+0

我可能已经找到了泄漏背后的原因:如果我的PDF从NSCachesDirectory目录,则相应发生泄漏。也许我应该使用不同的目录下载内容。 – indi

+0

我可能是错误的泄漏依赖于目录的PDF位于 – indi

+0

我从你的链接运行该项目,但它显示没有泄漏... – borrrden

回答

0

我犯了很多错误,特别是双重释放文档引用。但是,这并不是我的情况中的真正动物。

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

pdftk original output destination 
1

resourceRef将被过度发布。看看你在做什么。

1)桥resourceRef没有所有权的变化(由ARC依然拥有)

2)CFReleaseresourceRef

3)ARC也释放resourceRef

你不需要第2步电弧

虽然这不是内存泄漏,但是过度释放。