Objective c 目标C:CGDataProviderCopyData内存泄漏

Objective c 目标C:CGDataProviderCopyData内存泄漏,objective-c,memory,memory-management,memory-leaks,instruments,Objective C,Memory,Memory Management,Memory Leaks,Instruments,在仪器的帮助下,可以看出CGDataProviderCopyData使用了太多内存。如何解决这个问题 -(UIImage*)imageNamed:(NSString*)name { UIImage *uiimage = [UIImage imageNamed:name]; CGImageRef originalImage = [uiimage CGImage]; CFDataRef imageData = CGDataProviderCopyData( CGImageGe

在仪器的帮助下,可以看出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];
}

问题在于,您从未发布过
图像

按如下方式更新您的代码:

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

问题是您从未发布
图像

按如下方式更新您的代码:

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

最后,我终于解决了这个问题。实际上,很少有额外的不必要的步骤会导致内存泄漏。以下是更新后的函数:

-(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的上述步骤是不必要的

最后,我终于解决了这个问题。实际上,很少有额外的不必要的步骤会导致内存泄漏。以下是更新后的函数:

-(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的上述步骤是不必要的

显示产生此问题的代码。请检查屏幕截图中的代码。你没有看到截图吗?不要将代码作为图像发布。复制并粘贴实际代码。现在添加代码。屏幕截图来自显示实际问题的仪器。@AbdulJamil imageData变量的图像有多大?您希望imageData变量使用多少内存?向我们展示产生此问题的代码。请检查屏幕截图中的代码。你没有看到截图吗?不要将代码作为图像发布。复制并粘贴实际代码。现在添加代码。屏幕截图来自显示实际问题的仪器。@AbdulJamil imageData变量的图像有多大?您希望imageData变量使用多少内存?我已经尝试释放该图像,但它导致崩溃。也是CGImageRelease(图像);非CFImageRelease(图像);我已经试着释放图像,但它引入了崩溃。也是CGImageRelease(图像);非CFImageRelease(图像);