1

返されるコードの最後の 2 行は、潜在的なメモリ リークの警告を示しています。.....これは真陽性の警告ですか、それとも偽陽性の警告ですか? 本当の場合、どうすれば修正できますか? 助けてくれてどうもありがとう!

-(UIImage*)setMenuImage:(UIImage*)inImage isColor:(Boolean)bColor
{ 
    int w = inImage.size.width + (_borderDeep * 2);
    int h = inImage.size.height + (_borderDeep * 2);

    CGColorSpaceRef colorSpace;
    CGContextRef context;

    if (YES == bColor)
    {
        colorSpace = CGColorSpaceCreateDeviceRGB();
        context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst);
    }
    else
    {
        colorSpace = CGColorSpaceCreateDeviceGray();
        context = CGBitmapContextCreate(NULL, w, h, 8, w, colorSpace, kCGImageAlphaNone);        
    }

    CGContextSetInterpolationQuality(context, kCGInterpolationHigh);

    CGContextDrawImage(context, CGRectMake(_borderDeep, _borderDeep, inImage.size.width, inImage.size.height), inImage.CGImage);

    CGImageRef image = CGBitmapContextCreateImage(context);
    CGContextRelease(context); //releasing context
    CGColorSpaceRelease(colorSpace); //releasing colorSpace

    //// The two lines of code above caused Analyzer gives me a warning of potential leak.....Is this a true positive warning or false positive warning? If true, how do i fix it?
    return [UIImage imageWithCGImage:image];
}
4

2 に答える 2

9

オブジェクトをリークしていCGImageます(変数に保存されていimageます)。を作成した後にイメージをリリースすることで、これを修正できますUIImage

UIImage *uiImage = [UIImage imageWithCGImage:image];
CGImageRelease(image);
return uiImage;

これは、CoreGraphics が CoreFoundation の所有規則に従うためです。この場合、「作成」ルールです。つまり、「作成」(または「コピー」) を含む関数は、自分で解放する必要があるオブジェクトを返します。したがって、この場合、は、リリースする責任がある をCGBitmapContextCreateImage()返します。CGImageRef


UIGraphicsちなみに、便利な関数を使用してコンテキストを作成しないのはなぜですか? これらは、結果の に適切なスケールを配置することを処理しUIImageます。入力画像と一致させたい場合は、それも可能です

CGSize size = inImage.size;
size.width += _borderDeep*2;
size.height += _borderDeep*2;
UIGraphicsBeginImageContextWithOptions(size, NO, inImage.scale); // could pass YES for opaque if you know it will be
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
[inImage drawInRect:(CGRect){{_borderDeep, _borderDeep}, inImage.size}];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
于 2012-05-21T22:21:26.807 に答える
1

作成したCGImageRefを解放する必要があります。CGBitmapContextCreateImage名前に「create」が含まれています。これは、このメモリを解放する責任があることを意味します(Appleはその命名規則に厳密です)。

最後の行を次のように置き換えます

UIImage *uiimage = [UIImage imageWithCGImage:image];
CGImageRelease(image);
return uiimage;
于 2012-05-21T22:25:59.567 に答える