Objective c 帮助查找内存泄漏

Objective c 帮助查找内存泄漏,objective-c,cocoa,memory-leaks,nsimage,Objective C,Cocoa,Memory Leaks,Nsimage,有谁能帮我找到下面代码中的内存泄漏,它可以调整图像的亮度 +(NSImage *)brightness:(NSImage *)image andLevel:(int)level { CGImageSourceRef source= CGImageSourceCreateWithData((CFDataRef)[image TIFFRepresentation], NULL); CGImageRef img = CGImageSourceCreateImageAtIndex(so

有谁能帮我找到下面代码中的内存泄漏,它可以调整图像的亮度

+(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];
}
+(NSImage*)亮度:(NSImage*)图像和级别:(int)级别
{
CGImageSourceRef source=CGImageSourceCreateWithData((CFDataRef)[image TIFFRepresentation],NULL);
CGImageRef img=CGImageSourceCreateMageAtIndex(源,0,空);
NSSize size=image.size;
CGRect rect=CGRectMake(0.0f,0.0f,size.width,size.height);
//从接收器的CGImage获取位图数据
CFDataRef dataref=CGDataProviderCopyData(CGImageGetDataProvider(img));
//从位图图像获取字节
UInt8*数据=(UInt8*)CFDataGetBytePtr(dataref);
//获得长度
int length=CFDataGetLength(dataref);
//对像素执行操作

对于(int index=0;index替换以下代码行):

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

这个:
return[newImage autorelease];
with
returnnewimage;

我不是百分之百确定,但是试试看,希望能有所帮助


:)

您忘记了发布通过创建函数获得的
newImg
。此外,您不应该发布
colorSpace
,因为您没有通过创建或复制函数获得它,也没有保留它。

您的建议会产生与原始代码相同的结果。我已经说过了,我不确定是不是et无法阻止自己帮助他。:)你确定有什么东西泄漏了?@akhil:那么请告诉我们,泄漏的是什么东西?@akhil
newImg
是唯一明显的泄漏。如果你有其他泄漏,那么可能不在你粘贴的代码中(在实现我的建议后)。
NSImage* newImage = [[[NSImage alloc] initWithSize:size] autorelease];