2

ビューに解像度に依存しないグラフィックを表示できるように、pdf 画像データをロードする UIImageView ビューのサブクラスがあります。示された目的にはうまく機能しますが、インストルメント リーク プロファイルによると、これでメモリ リークが発生しています。

以下は、リークの原因であると思われるコードです。問題を追跡しようとしていますが、問題を特定する方法が少しわかりません。

- (id)initWithPDFResourceAtPath:(NSString *)path center:(CGPoint)center {
    if ((self = [super init])){
        CGPDFPageRelease(pageRef);
        CGPDFDocumentRef documentRef = CGPDFDocumentCreateWithURL((__bridge CFURLRef)[NSURL fileURLWithPath:path]);
        pageRef = CGPDFDocumentGetPage(documentRef, 1);
        CGPDFPageRetain(pageRef);
        CGPDFDocumentRelease(documentRef);
        [self setBounds];
    }
    return self;
}

-(void)setBounds {
    [self setBounds:CGRectApplyAffineTransform(CGPDFPageGetBoxRect(pageRef, kCGPDFMediaBox), CGAffineTransformMakeScale(scaleH, scaleV))];
    size = self.bounds.size;
    [self getPDFimage];
}

-(void)getPDFimage {
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextScaleCTM(context, scaleH, scaleV);
    CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
    CGContextSetRenderingIntent(context, kCGRenderingIntentDefault);
    CGContextDrawPDFPage(context, pageRef);
    [self setImage:UIGraphicsGetImageFromCurrentImageContext()];
}
4

1 に答える 1

1

に電話するのを忘れましたUIGraphicsEndImageContext()。コードを次のように変更します。

UIImage *image = [self setImage:UIGraphicsGetImageFromCurrentImageContext()];
UIGraphicsEndImageContext();
return image;

EDIT1: あなたのコードにはこの pageRef 変数があります - それは ivar ですか、それとも static ですか? ivar の場合は、dealloc メソッドで CGPDFPageRelease() を使用して解放することをお勧めします。【本当はイヴァールのはず】

EDIT2: オブジェクト割り当てに関する添付のスクリーン ショットを参照してください。タイプと現在の金額、およびその順序が多い順に表示されます。

ここに画像の説明を入力

EDIT3:他のすべてが失敗し、同じ問題を持つデモ プロジェクトを作成して Dropbox に投稿します。

EDIT4: コードは次の場所にアップロードされました:ここ(5 月 28 日まで見ることができません)

EDIT5: 問題は、pageRef が解放されないことです。そう:

1) 何もしないので、init メソッドからこれを削除します。

CGPDFPageRelease(pageRef);

2 新しい dealloc メソッドに移動します。

- (void)dealloc
{
    CGPDFPageRelease(pageRef);
}
于 2013-05-15T13:04:08.553 に答える