从UIImage获取数据时内存泄漏

时间:2015-03-05 12:50:46

标签: ios iphone

我想从UIImage中提取数据并对该数据执行某些操作。 我从UIImage中提取数据时发现了内存问题。 为了隔离问题,我创建了一个新项目,其中只有一个从UIImage中提取数据的方法。

 -(void)runMemoryValidation:(NSArray*)images  {

    for ( int i=0; i<images.count;  i++) {

        @autoreleasepool {


            NSString* imageName = [images objectAtIndex:i];
            UIImage* image = [UIImage imageNamed:imageName];
            NSUInteger width = 500;//CGImageGetWidth(image.CGImage);
            NSUInteger height = 500;//CGImageGetHeight(image.CGImage);
            //Ref<IntMatrix> matrix(new IntMatrix(width,height));



            CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
            unsigned char *data = (unsigned char*) calloc(height * width * 4, sizeof(unsigned char));
            NSUInteger bytesPerPixel = 4;
            NSUInteger bytesPerRow = bytesPerPixel * width;
            NSUInteger bitsPerComponent = 8;
            CGContextRef context = CGBitmapContextCreate(data, width, height,
                                                         bitsPerComponent, bytesPerRow, colorSpace,
                                                         kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
            CGColorSpaceRelease(colorSpace);

            CGContextDrawImage(context, CGRectMake(0, 0, width, height), image.CGImage);
            CGContextRelease(context);

            free(data);
        }


     }
       }

我发送此方法100个文件名,每个循环我加载图像并提取数据。

附上截图,你可以看到内存变得非常快,并且在for循环结束后没有被释放 enter image description here 我做错了什么?

谢谢!

1 个答案:

答案 0 :(得分:2)

您在此代码中没有做与内存管理有关的任何错误。正如@picciano在他的评论中+imageNamed:方法所说,它会加载它加载的图像,因此使用+imageWithContentsOfFile:方法并不是这样。也可以在实际设备上进行测量,因为在模拟器上进行测试时,内存使用,压力等存在差异。