2011-01-12 13 views
7

PDFリーダーの場合、各ページの「スクリーンショット」を作成してディスクに保存してドキュメントを作成します。PDFメモリ割り当て(CGPDFDocumentRef)の秘訣は何ですか(tf)

MEMORY BEFORE:   6 MB 
MEMORY DURING 1ST DOC: 40 MB 
MEMORY AFTER 1ST DOC: 25 MB 
MEMORY DURING 2ND DOC: 40 MB 
MEMORY AFTER 2ND DOC: 25 MB 
.... 
:最初のアプローチは

CGPDFDocumentRef document = CGPDFDocumentCreateWithURL((CFURLRef) someURL); 
for (int i = 1; i<=pageCount; i++) 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];  
    CGPDFPageRef page = CGPDFDocumentGetPage(document, i); 
    ...//getting + manipulating graphics context etc. 
    ... 
    CGContextDrawPDFPage(context, page); 
    ... 
    UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext(); 
    ...//saving the image to disc 
    [pool drain]; 
} 
CGPDFDocumentRelease(document); 
これは、ループの最初の実行後にリリースされていないようです多くのメモリになり

(第一文書を作成する)が、追加の実行中にこれ以上の未発表のメモリであります

for (int i = 1; i<=pageCount; i++) 
{ 
    CGPDFDocumentRef document = CGPDFDocumentCreateWithURL((CFURLRef) someURL); 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];  
    CGPDFPageRef page = CGPDFDocumentGetPage(document, i); 
    ...//getting + manipulating graphics context etc. 
    ... 
    CGContextDrawPDFPage(context, page); 
    ... 
    UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext(); 
    ...//saving the image to disc 
    CGPDFDocumentRelease(document); 
    [pool drain]; 
} 

にコードを変更する

にメモリ使用量を変化させます

しかし、明らかにパフォーマンスが後退しています。

最初のケースではPDF(後で別のスレッド)を読み始めると、それ以上のメモリは割り当てられません(25 MBに留まる)が、2番目のケースではメモリは20 MB(7から)になります。

どちらの場合も、CGContextDrawPDFPage(context, page);のラインメモリを削除すると、ドキュメントの準備中および作成後に6MBの(ほぼ)一定です。

誰でも何が起こっているのか説明できますか?

答えて

4

CGPDFDocumentのキャッシュは非常に積極的ですが、あなたはこれまでのように、ドキュメントを解放してディスクから再ロードすることを除いて、それをほとんど制御できません。

CGContextDrawPDFPage呼び出しを削除したときにたくさんの割り当てが表示されないのは、Quartzがページリソースを遅延ロードするためです。 CGPDFDocumentGetPageを呼び出すだけで、バウンディングボックスやアノテーション(メモリが非常に小さい)などの基本的なメタデータがロードされます。

フォント、イメージなどは、実際にページを描画するときにのみ読み込まれますが、内部キャッシュに比較的長い時間保持されます。これは、ページリソースが複数のページで共有されることが多いため、レンダリングを高速化するためのものです。また、ページを複数回レンダリングすること(たとえば、ズームインする場合)もかなり一般的です。ページを2度目にレンダリングする方がはるかに高速です。

+0

ありがとう、私には意味があるので、実際にそれを証明せずに「正しい」とマークしました。 –

+1

こんにちはomz。詳細な説明はありがとうございます。私は同様の問題を抱えています。私はページのレンダリングを続けるとメモリ使用量が大幅に増加しています。アプリケーションはある時点でクラッシュしています。各ページに別々のPDFDocumentを使用していますdrawLayer:inContext:method.pleaseで作成されてリリースされたページを、ページコンテンツの自動キャッシュを回避し、メモリ使用量を減らすための提案をします。 – Hariprasad

+0

@ハリプラサド私はあなたと同じ問題を少し持ちます。そして私はそこに何か解決策を見つけることができません。フレームワークのバグその他がリリースだと言う人もいますが、私はすべてをリリースしたと思います。私はリークや何かを持っていないとまだいくつかの時点でクラッシュします。あなたはこれに対する解決策を見つけましたか? – otakuProgrammer