Objective c 目标C:CGDataProviderCopyData内存泄漏
在仪器的帮助下,可以看出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
-(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(图像);