Objective-C:CGDataProviderCopyData导致内存泄漏

问题描述 投票:0回答:2

在仪器的帮助下,显示CGDataProviderCopyData使用了太多内存。如何解决这个问题?

-(UIImage*)imageNamed:(NSString*)name {

UIImage *uiimage = [UIImage imageNamed:name];


CGImageRef originalImage = [uiimage CGImage];
CFDataRef imageData = CGDataProviderCopyData(
         CGImageGetDataProvider(originalImage));
CGDataProviderRef imageDataProvider = CGDataProviderCreateWithCFData(imageData);
CFRelease(imageData);
CGImageRef image = CGImageCreate(
         CGImageGetWidth(originalImage),
         CGImageGetHeight(originalImage),
         CGImageGetBitsPerComponent(originalImage),
         CGImageGetBitsPerPixel(originalImage),
         CGImageGetBytesPerRow(originalImage),
         CGImageGetColorSpace(originalImage),
         CGImageGetBitmapInfo(originalImage),
         imageDataProvider,
         CGImageGetDecode(originalImage),
         CGImageGetShouldInterpolate(originalImage),
         CGImageGetRenderingIntent(originalImage));
CGDataProviderRelease(imageDataProvider);



return [UIImage imageWithCGImage:image];
}

Instrument screenshot

objective-c memory memory-management memory-leaks instruments
2个回答
1
投票

最后,我能够解决这个问题。实际上,几乎没有多余的不必要的步骤导致内存泄漏。这是更新的功能:

-(UIImage*)imageNamed:(NSString*)name {

 UIImage *uiimage = [UIImage imageNamed:name];


 CGImageRef originalImage = [uiimage CGImage];

 CGImageRef image = CGImageCreate(
     CGImageGetWidth(originalImage),
     CGImageGetHeight(originalImage),
     CGImageGetBitsPerComponent(originalImage),
     CGImageGetBitsPerPixel(originalImage),
     CGImageGetBytesPerRow(originalImage),
     CGImageGetColorSpace(originalImage),
     CGImageGetBitmapInfo(originalImage),
     CGImageGetDataProvider(originalImage),
     CGImageGetDecode(originalImage),
     CGImageGetShouldInterpolate(originalImage),
     CGImageGetRenderingIntent(originalImage));

 return [UIImage imageWithCGImage:image];
}

CGImageGetDataProvider(originalImage)返回CGDataProviderRef,这是CGImageCreate函数中第8个参数所必需的。上面的步骤复制图像数据,然后创建CGDataProviderRef是不必要的。


1
投票

问题是你永远不会释放image

更新您的代码如下:

-(UIImage*)imageNamed:(NSString*)name {
    UIImage *uiimage = [UIImage imageNamed:name];

    CGImageRef originalImage = [uiimage CGImage];
    CFDataRef imageData = CGDataProviderCopyData(
             CGImageGetDataProvider(originalImage));
    CGDataProviderRef imageDataProvider = CGDataProviderCreateWithCFData(imageData);
    CFRelease(imageData);
    CGImageRef image = CGImageCreate(
             CGImageGetWidth(originalImage),
             CGImageGetHeight(originalImage),
             CGImageGetBitsPerComponent(originalImage),
             CGImageGetBitsPerPixel(originalImage),
             CGImageGetBytesPerRow(originalImage),
             CGImageGetColorSpace(originalImage),
             CGImageGetBitmapInfo(originalImage),
             imageDataProvider,
             CGImageGetDecode(originalImage),
             CGImageGetShouldInterpolate(originalImage),
             CGImageGetRenderingIntent(originalImage));
    CGDataProviderRelease(imageDataProvider);

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

    return result;
}
© www.soinside.com 2019 - 2024. All rights reserved.