0

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 は、リークされたオブジェクトは、CoreGraphics が担当する Malloc 48 バイトであることを教えてくれました。また、スタックトレースには CGPDFDocumentCreateWithURL が含まれています。リークとは、所有者のいないオブジェクトがそこにあることを意味します。

問題を再現した git リポジトリを作成しました: https://github.com/indika/PDFLeaks

何か案は。助けや「ポインタ」をいただければ幸いです。

4

2 に答える 2

1

resourceRef はオーバーリリースされます。あなたがしていることを見てください。

1) 所有権を変更せずに ARC にブリッジresourceRefする (引き続き ARC が所有する)

2)CFReleaseオンresourceRef

3) ARCもリリースresourceRef

ステップ2は必要ありません

これはメモリ リークではなく、オーバーリリースです。

于 2012-10-15T08:22:47.330 に答える
0

特にドキュメント参照の二重リリースで、多くの間違いを犯しました。しかし、それは私の状況では本当の生き物ではありませんでした.

壊れた PDF を読み込んでいました。私はpdftkを使用してpdfドキュメントをスライスおよびマージしていましたが、インデックスを壊していました。そのため、PDF を pdftk でマージした後、次のようにファイルを修復することを忘れないでください。

pdftk original output destination
于 2012-10-17T13:08:10.597 に答える