2012-05-01 9 views
1

この質問は何度か尋ねられましたが、私の場合は解決できませんでした。 CGContextDrawPDFPageはリーク計測器のリークとして表示されます。また、このコードセグメントを実行すると、アプリのクラッシュが発生します。これはメモリの問題によるものです。iOSリーク機器CGContextDrawPDFPage

pdfURLDocument = [[NSURL alloc] initFileURLWithPath: [docsDir stringByAppendingPathComponent:documentName]]; 
    pdfDocument = CGPDFDocumentCreateWithURL((CFURLRef)pdfURLDocument); 
    [pdfURLDocument release]; 

    page = CGPDFDocumentGetPage(pdfDocument, 1); 
    CGPDFPageRetain(page); 

    // determine the size of the PDF page 
    CGRect pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox); 
    pdfScaleWidth = (1/((CGFloat) gridSizeDocument)) * self.frame.size.width/pageRect.size.width; 
    pdfScaleHeight = (1/((CGFloat) gridSizeDocument)) * self.frame.size.height/pageRect.size.height; 
    pageRect.size = CGSizeMake(pageRect.size.width*pdfScaleWidth, pageRect.size.height*pdfScaleHeight); 


    // Create a low res image representation of the PDF page   
    UIGraphicsBeginImageContext(pageRect.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // First fill the background with white. 
    CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0); 
    CGContextFillRect(context,pageRect); 

    CGContextSaveGState(context); 
    // Flip the context so that the PDF page is rendered 
    // right side up. 
    CGContextTranslateCTM(context, 0.0, pageRect.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 

    // Scale the context so that the PDF page is rendered 
    // at the correct size for the zoom level. 
    CGContextScaleCTM(context, pdfScaleWidth, pdfScaleHeight); 
    CGContextSetInterpolationQuality(context, kCGInterpolationHigh); 
    CGContextSetRenderingIntent(context, kCGRenderingIntentDefault); 
    CGContextDrawPDFPage(context, page); 
    CGContextRestoreGState(context); 

    backgroundImage = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 
    CGPDFPageRelease(page); 

また、CGPDFPageRelease(page)も含めました。 deallocメソッドで。また、小規模な文書ではうまく動作するが、大きな文書ではクラッシュするだけであることを付け加えると便利です。しかし、メモリリークは依然として小さいものでも持続します。

+0

スタティックアナライザはあなたに何を伝えますか? –

+0

これはいくつかのメモリリークを示していますが、それらのすべてがこの問題と完全に無関係のようです。 – user1120008

答えて

0

のリリースは、の後で使用されています。以前は使用されていませんでした。したがって、最初にCGPDFPageRelease(page)をこのコードブロックの最後に移動し、それが役立つかどうかを確認してください。また、問題はpdf変数に格納されたCGPDFDocumentRefと関係している可能性があります。上記のことが役に立たない場合は、参照を取得する方法と、その参照を保持してリリースする場所を示すとよいでしょう。

+1

私はあなたのアプローチを試みたが運がなかった。私はまた、(空)deallocメソッドですでに解放されたオブジェクトにリリースが送られたので、その部分を削除したというエラーも出てきました。より完全なコードで編集しました。 – user1120008

1

私はこれが古い質問ですけど、2つの観測:

  1. あなたのpdfDocumentを解放する必要があります。

    CGPDFDocumentRelease(pdfDocument); 
    
  2. あなたははしかし、CGPDFPageRelease(page)pageを解放するべきではありませんこれは自動再生されたオブジェクトであり、あなたが所有していないためです(もちろん、CGPDFPageRetainでそれを保持していない限り)。

静的アナライザー(Xcodeの「製品」メニューで「分析」)を使用する場合は、両方の問題を指摘する必要があります。

基本的な問題は、iOSバージョン6.0より前のバージョンではCGContextDrawPDFPageがリークすることです。

+1

これは受け入れられる回答である必要があります。 +1 –

関連する問題