帮助查找内存泄漏

问题描述:

任何人都可以帮助我找到下面的代码中的内存泄漏,它调整图像的亮度?帮助查找内存泄漏

+(NSImage *)brightness:(NSImage *)image andLevel:(int)level 
{ 
    CGImageSourceRef source= CGImageSourceCreateWithData((CFDataRef)[image TIFFRepresentation], NULL); 
    CGImageRef img = CGImageSourceCreateImageAtIndex(source, 0, NULL); 


    NSSize size = image.size; 
    CGRect rect = CGRectMake(0.0f, 0.0f, size.width, size.height); 
    //getting bitmap data from receiver's CGImage 
    CFDataRef dataref=CGDataProviderCopyData(CGImageGetDataProvider(img)); 
    //getting bytes from bitmap image 
    UInt8 *data=(UInt8 *)CFDataGetBytePtr(dataref); 
    //getting length 
    int length=CFDataGetLength(dataref); 
    // Perform operation on pixels 
    for(int index=0;index<length;index += 1) 
    { 
     // Go For BRIGHTNESS 
     for(int i=0;i<3;i++) 
     { 
      //printf("This pixel is:%d",data[index + i]); 
      if(data[index+i]+level<0) 
      { 
       data[index+i]=0; 
      } 
      else 
      { 
       if(data[index+i]+level>255) 
       { 
        data[index+i]=255; 
       } 
       else 
       { 
        data[index+i]+=level; 
       } 
      } 
     } 
    } 

    // .. Take image attributes 
    size_t width=CGImageGetWidth(img); 
    size_t height=CGImageGetHeight(img); 
    size_t bitsPerComponent=CGImageGetBitsPerComponent(img); 
    size_t bitsPerPixel=CGImageGetBitsPerPixel(img); 
    size_t bytesPerRow=CGImageGetBytesPerRow(img); 

    // .. Do the pixel manupulation 
    CGColorSpaceRef colorspace=CGImageGetColorSpace(img); 
    CGBitmapInfo bitmapInfo=CGImageGetBitmapInfo(img); 
    CFDataRef newData=CFDataCreate(NULL,data,length); 
    CGDataProviderRef provider=CGDataProviderCreateWithCFData(newData); 

    // .. Get the Image out of this raw data 
    CGImageRef newImg=CGImageCreate(width,height,bitsPerComponent,bitsPerPixel,bytesPerRow,colorspace,bitmapInfo,provider,NULL,true,kCGRenderingIntentDefault); 

    // .. Prepare the image from raw data 
    NSImage* newImage = [[NSImage alloc] initWithSize:size]; 
    //To make the drawing appear on the image instead of on the screen 
    [newImage lockFocus]; 
    //Draws an image into a graphics context. 
    CGContextDrawImage([[NSGraphicsContext currentContext] graphicsPort],*(CGRect*)&rect, newImg); 
    [newImage unlockFocus]; 
    // .. done with all,so release the references 

    CFRelease(source); 
    CFRelease(img); 
    CFRelease(dataref); 
    CFRelease(colorspace); 
    CFRelease(newData); 
    CFRelease(provider); 
    return [newImage autorelease]; 
} 
+0

你确定什么物体被泄漏? – 2011-05-06 05:42:47

将以下代码行:

NSImage* newImage = [[NSImage alloc] initWithSize:size]; 

NSImage* newImage = [[[NSImage alloc] initWithSize:size] autorelease]; 

这一个:return [newImage autorelease];return newImage;

我不是100%肯定这个,但给它是一个尝试,希望它可以帮助。

:)

+2

您的建议会得到与原始代码相同的结果。 – 2011-05-06 05:40:20

+0

newImage在函数结束时已经自动释放。 – duskwuff 2011-05-06 05:44:55

+0

我已经说过了,我不确定还是无法阻止自己帮助他。 :) – necixy 2011-05-06 05:56:23

你忘了释放newImg,您已通过创建函数获得。此外,您不应该发布colorSpace,因为您尚未通过“创建”或“复制”功能获取它,并且您尚未保留它。

+0

感谢您的建议,但内存仍然泄漏.. – akhil 2011-05-06 06:07:12

+0

@akhil:那么请告诉我们,它是什么对象被泄露? – 2011-05-06 06:09:24

+1

@akhil'newImg'是唯一明显的泄漏。如果你得到其他泄漏,可能不在你粘贴的代码中(在实施我的建议之后)。 – 2011-05-06 06:10:10