Memory imageWithCGImage使应用程序崩溃

Memory imageWithCGImage使应用程序崩溃,memory,crash,cgimage,Memory,Crash,Cgimage,我的项目是自动引用计数,但当我使用CGBitmapContextCreateImage和UIIMage的方法imageWithCGImage时,发生了一些事情。我写了一些测试代码,当代码运行时,内存增加,直到应用程序崩溃 设备: (UIImage*) createImageByImage:(UIImage*)img { CGSize imgSize = img.size; imgSize.width *= [UIScreen mainScreen].scale; img

我的项目是自动引用计数,但当我使用CGBitmapContextCreateImage和UIIMage的方法imageWithCGImage时,发生了一些事情。我写了一些测试代码,当代码运行时,内存增加,直到应用程序崩溃

设备:

(UIImage*) createImageByImage:(UIImage*)img
{
    CGSize imgSize = img.size;

    imgSize.width *= [UIScreen mainScreen].scale;
    imgSize.height *= [UIScreen mainScreen].scale;

    CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
    CGContextRef ctx = CGBitmapContextCreate(nil, imgSize.width, imgSize.height, 8, imgSize.width * (CGColorSpaceGetNumberOfComponents(space) + 1), space, kCGImageAlphaPremultipliedLast);
    CGColorSpaceRelease(space);

    CGRect rect;
    rect.origin = CGPointMake(0, 0);
    rect.size = imgSize;

    // here bypass some transformation to the CGContext

    CGContextDrawImage(ctx, rect, img.CGImage);

    CGImageRef cgImage = CGBitmapContextCreateImage(ctx);
    CGContextRelease(ctx);

    UIImage* image = [UIImage imageWithCGImage:cgImage scale:[UIScreen mainScreen].scale orientation:UIImageOrientationDown];
    CGImageRelease(cgImage);

    return image;
}
UIImage* baseImg = [UIImage imageNamed:@"corkboard.jpg"]; // any big image,e.g. 1024*768
for (int i = 0; i < 100;  i++) {
    UIImage* tempImg = [self createImageByImage:baseImg];
    tempImg = nil;
}
baseImg = nil;
[16G,iPad2,视网膜]

代码:

(UIImage*) createImageByImage:(UIImage*)img
{
    CGSize imgSize = img.size;

    imgSize.width *= [UIScreen mainScreen].scale;
    imgSize.height *= [UIScreen mainScreen].scale;

    CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
    CGContextRef ctx = CGBitmapContextCreate(nil, imgSize.width, imgSize.height, 8, imgSize.width * (CGColorSpaceGetNumberOfComponents(space) + 1), space, kCGImageAlphaPremultipliedLast);
    CGColorSpaceRelease(space);

    CGRect rect;
    rect.origin = CGPointMake(0, 0);
    rect.size = imgSize;

    // here bypass some transformation to the CGContext

    CGContextDrawImage(ctx, rect, img.CGImage);

    CGImageRef cgImage = CGBitmapContextCreateImage(ctx);
    CGContextRelease(ctx);

    UIImage* image = [UIImage imageWithCGImage:cgImage scale:[UIScreen mainScreen].scale orientation:UIImageOrientationDown];
    CGImageRelease(cgImage);

    return image;
}
UIImage* baseImg = [UIImage imageNamed:@"corkboard.jpg"]; // any big image,e.g. 1024*768
for (int i = 0; i < 100;  i++) {
    UIImage* tempImg = [self createImageByImage:baseImg];
    tempImg = nil;
}
baseImg = nil;
呼叫方:

(UIImage*) createImageByImage:(UIImage*)img
{
    CGSize imgSize = img.size;

    imgSize.width *= [UIScreen mainScreen].scale;
    imgSize.height *= [UIScreen mainScreen].scale;

    CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
    CGContextRef ctx = CGBitmapContextCreate(nil, imgSize.width, imgSize.height, 8, imgSize.width * (CGColorSpaceGetNumberOfComponents(space) + 1), space, kCGImageAlphaPremultipliedLast);
    CGColorSpaceRelease(space);

    CGRect rect;
    rect.origin = CGPointMake(0, 0);
    rect.size = imgSize;

    // here bypass some transformation to the CGContext

    CGContextDrawImage(ctx, rect, img.CGImage);

    CGImageRef cgImage = CGBitmapContextCreateImage(ctx);
    CGContextRelease(ctx);

    UIImage* image = [UIImage imageWithCGImage:cgImage scale:[UIScreen mainScreen].scale orientation:UIImageOrientationDown];
    CGImageRelease(cgImage);

    return image;
}
UIImage* baseImg = [UIImage imageNamed:@"corkboard.jpg"]; // any big image,e.g. 1024*768
for (int i = 0; i < 100;  i++) {
    UIImage* tempImg = [self createImageByImage:baseImg];
    tempImg = nil;
}
baseImg = nil;

[UIImage imageWithCGImage:cgImage ....];
[UIImage imageWithCGImage:img.CGImage ....];

错误消失了!但是后来功能改变了,不能满足原来的需求

您是否尝试添加baseImg=nil;到你的回路?我试过了,没用!baseImg=零;应该在循环内。我更改了调用者,baseImg定义现在在循环外,因此baseImg=nil;不能在循环内。