Xcode 应用筛选器时释放CGDataProviderWithCopyOfData

Xcode 应用筛选器时释放CGDataProviderWithCopyOfData,xcode,ios7,ios7.1,Xcode,Ios7,Ios7.1,我有一个方法,可以应用着色效果过滤器并创建CGBitmapContext。每次用户点击过滤器按钮时,它都会增加内存,并且不会通过ARC释放内存。每次增加600KB。我做了一些研究,在仪器分配上发现核心图形在CGDataProviderWithCopyOfData上增加了600KB。如何发布此CGR光栅数据 方法如下: -(UIImage *)modifyImageTintColor:(UIImage *)source imageRawData:(Byte *)rawData degree:(in

我有一个方法,可以应用着色效果过滤器并创建CGBitmapContext。每次用户点击过滤器按钮时,它都会增加内存,并且不会通过ARC释放内存。每次增加600KB。我做了一些研究,在仪器分配上发现核心图形在CGDataProviderWithCopyOfData上增加了600KB。如何发布此CGR光栅数据

方法如下:

-(UIImage *)modifyImageTintColor:(UIImage *)source imageRawData:(Byte *)rawData degree:(int)degree{

double PI = 3.14159;
double HALF_CIRCLE_DEGREE = 180;
double RANGE = 256;

int RY, GY, BY, RYY, GYY, BYY, R, G, B, Y;
double angle = (PI * (double)degree) / HALF_CIRCLE_DEGREE;

int S = (int)(RANGE * sin(angle));
int C = (int)(RANGE * cos(angle));

CGFloat r, g, b;
//apply sepia effect

int byteIndex = 0;
for(int i = 0; i < _imageWidth * _imageHeight; ++i){

    r = rawData[byteIndex];
    g = rawData[byteIndex + 1];
    b = rawData[byteIndex + 2];

    RY = ( 70 * r - 59 * g - 11 * b ) / 100;
    GY = (-30 * r + 41 * g - 11 * b ) / 100;
    BY = (-30 * r - 59 * g + 89 * b ) / 100;
    Y  = ( 30 * r + 59 * g + 11 * b ) / 100;
    RYY = ( S * BY + C * RY ) / 256;
    BYY = ( C * BY - S * RY ) / 256;
    GYY = (-51 * RYY - 19 * BYY ) / 100;
    R = Y + RYY;
    R = ( R < 0 ) ? 0 : (( R > 255 ) ? 255 : R );
    G = Y + GYY;
    G = ( G < 0 ) ? 0 : (( G > 255 ) ? 255 : G );
    B = Y + BYY;
    B = ( B < 0 ) ? 0 : (( B > 255 ) ? 255 : B );

    rawData[byteIndex] = R;
    rawData[byteIndex + 1] = G;
    rawData[byteIndex + 2] = B;

    byteIndex += 4;


}

NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * _imageWidth;
NSUInteger bitsPerComponent = 8;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGImageRef imageRef;

CGContextRef ctx;
ctx = CGBitmapContextCreate(rawData,
                            _imageWidth,
                            _imageHeight,
                            bitsPerComponent,
                            bytesPerRow,
                            colorSpace,
                            kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);

imageRef = CGBitmapContextCreateImage(ctx);
UIImage *result = [UIImage imageWithCGImage:imageRef];
CGContextRelease(ctx);
CGColorSpaceRelease(colorSpace);
CFRelease(ctx);

return result;
}

您需要在imageRef上调用CFRelease,如下所示:

imageRef = CGBitmapContextCreateImage(ctx);
UIImage *result = [UIImage imageWithCGImage:imageRef];
CFRelease (imageRef);
CGContextRelease(ctx);
CGColorSpaceRelease(colorSpace);
CFRelease(ctx);
imageRef = CGBitmapContextCreateImage(ctx);
UIImage *result = [UIImage imageWithCGImage:imageRef];
CFRelease (imageRef);
CGRelease(ctx);
CGRelease(colorSpace);
CFRelease(ctx);
另外,始终使用CFRelease而不是像这样的自定义发布程序,看起来更整洁,可读性更强:

imageRef = CGBitmapContextCreateImage(ctx);
UIImage *result = [UIImage imageWithCGImage:imageRef];
CFRelease (imageRef);
CGContextRelease(ctx);
CGColorSpaceRelease(colorSpace);
CFRelease(ctx);
imageRef = CGBitmapContextCreateImage(ctx);
UIImage *result = [UIImage imageWithCGImage:imageRef];
CFRelease (imageRef);
CGRelease(ctx);
CGRelease(colorSpace);
CFRelease(ctx);

U无法在CGImageRef上调用CFRelease您可以在imageRef上调用CFRelease。这是CGImageRef上CGImageRelease的苹果,看看讨论部分。有人有答案吗???