6

アプリを Instruments で分析すると、CGContextDrawPDFPage によって割り当てられたデータがすぐに解放されないことがわかりました。私のプログラムは多くの「メモリ警告」を受け取るので、できるだけ多くのメモリを解放したいのですが、このメモリを解放する方法がわかりません。

http://twitpic.com/473e89/fullでわかるように、このコードに関連しているようです

-(void)drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx{
    NSAutoreleasePool * tiledViewPool = [[NSAutoreleasePool alloc] init];
    CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0);
    CGContextFillRect(ctx, CGContextGetClipBoundingBox(ctx));
    CGAffineTransform pdfTransform = CGPDFPageGetDrawingTransform([self.superview.superview getPage],kCGPDFMediaBox,tiledLayer.bounds, 0, true);
    CGContextSaveGState (ctx);
    CGContextTranslateCTM(ctx, 0.0, tiledLayer.bounds.size.height);
    CGContextScaleCTM(ctx, 1.0, -1.0);
    CGContextConcatCTM (ctx, pdfTransform);
    CGContextClipToRect (ctx, CGPDFPageGetBoxRect([self.superview.superview getPage],kCGPDFMediaBox));
    CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh);
    CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);
    CGContextDrawPDFPage(ctx,[self.superview.superview getPage]);
    CGContextRestoreGState (ctx);
    UIGraphicsEndPDFContext();
    [tiledViewPool drain];
}

私はすでに AutoReleasePool をラップしようとしましたが、これは何の影響もないようです。スクリーンショットは、TiledView (メソッドが属するビュー) の割り当てが解除された後に取得されます。

誰かがメモリ使用量を減らすのを手伝ってくれることを願っています。

4

2 に答える 2

3

ある時点で iOS で PDF を処理しなければならなかった私が知っているすべての人が、この同じ問題を抱えていました。唯一の解決策は、ドキュメントをリリースして再作成することです。

もう 1 つの一般的な問題は、ドキュメントをリリースしているときに、CATiledLayer がそのドキュメントのページを同時にレンダリングしている可能性があることです。そのため、@synchronize を (おそらく pdfDocRef を使用して) 有効に活用し、タイル化されたレイヤーが作業を終了したときにのみドキュメントをリリースする必要があります。

また、こちらもチェックしてください: iPhone / iPad / iOS 用の高速で無駄のない PDF ビューアー - ヒントとヒント?

于 2011-03-11T06:23:57.413 に答える
1

同様の問題がありましたが、

PDFページを取得するこの行

[self.superview.superview getPage]

ページを引き出すたびに必ずpdfを再度開いてください.CGPDFDocumentはメモリを非常にうまく処理します.

例えば。何かのようなもの

//release the current pdf doc
 if(self.pdfDocumentRef!=nil){
   CGPDFDocumentRelease(self.pdfDocumentRef);
 }
 //open it again
 self.pdfDocumentRef=CGPDFDocumentCreateWithURL(..your url..);
 //pull out a page
 CGPDFPageRef pg = CGPDFDocumentGetPage(self.pdfDocumentRef, pageIndex+1);
于 2011-03-11T06:07:36.303 に答える