我想从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循环结束后没有被释放 我做错了什么?
谢谢!
答案 0 :(得分:2)
您在此代码中没有做与内存管理有关的任何错误。正如@picciano在他的评论中+imageNamed:
方法所说,它会加载它加载的图像,因此使用+imageWithContentsOfFile:
方法并不是这样。也可以在实际设备上进行测量,因为在模拟器上进行测试时,内存使用,压力等存在差异。