2012-05-21 5 views
1

마지막 두 줄의 코드가 반환되면 잠재적 인 메모리 누수 경고가 발생합니다. ..... 이것이 진정한 긍정적 경고입니까 거짓 경고입니까? 사실이라면 어떻게 고칠 수 있습니까? 도와 주셔서 정말로 고맙습니다!아래의 코드는 잠재적 인 메모리 누수가 있습니까?

-(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]; 
} 

답변

9

당신은 CGImage 객체 (즉, 당신의 image 변수에 저장된) 누출하고 있습니다. UIImage을 만든 후에 이미지를 해제하여이 문제를 해결할 수 있습니다.

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

그 이유는있는 CoreGraphics가 CoreFoundation에서 소유권 규칙을 따르는 것입니다; 이 경우에는 "Create" rule입니다. 즉, "작성"(또는 "복사") 기능을 사용하면 자신을 해제해야하는 객체가 반환됩니다. 따라서이 경우 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; 
+0

덕분에 많은 마지막 줄을 바꿉니다! :) – trillions

+0

정말 도움이되는 대답입니다! –

1

CGImageRef를 무료로 만들어야합니다. CGBitmapContextCreateImage은 이름에 "create"를 가지고 있는데, 이는이 메모리를 확보 할 책임이 있음을 의미합니다 (Apple은 이름 지정 규칙이 엄격합니다).

당신의 도움 케빈에 대한

UIImage *uiimage = [UIImage imageWithCGImage:image]; 
CGImageRelease(image); 
return uiimage; 
+1

고마워, 크레이리! – trillions

관련 문제