我尝试通过填充自己的数据来创建UIImage。到目前为止,一切都很顺利。但是,如果我尝试多次调用此函数,它似乎会填充内存直到应用程序崩溃。使用VM Tracker,我发现脏内存增长到328MB,其中当应用程序崩溃时,290MB是CG图像内存。
在启用ARC的情况下,我多次在循环中调用我的函数。图像相当大,但这不应该是问题,因为在前29次迭代中一切正常。据我所知,脏内存应该被应用程序再次重复使用。那正确吗?那么为什么它会填满我的内存,我该如何避免这个问题?
在启用ARC的情况下,我多次在循环中调用我的函数。图像相当大,但这不应该是问题,因为在前29次迭代中一切正常。据我所知,脏内存应该被应用程序再次重复使用。那正确吗?那么为什么它会填满我的内存,我该如何避免这个问题?
for(int i = 0; i < 1000; ++i) {
UIImage *img = [self createDummyImage:CGSizeMake(2000, 1600)];
}
创建虚拟UIImage的函数:
- (UIImage*)createDummyImage:(CGSize)size
{
unsigned char *rawData = (unsigned char*)malloc(size.width*size.height*4);
// fill in rawData (logic to create checkerboard)
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Host;
CGContextRef contextRef = CGBitmapContextCreate(rawData, size.width, size.height, 8, 4*size.width, colorSpaceRef, bitmapInfo);
CGImageRef imageRef = CGBitmapContextCreateImage(contextRef);
CGColorSpaceRelease(colorSpaceRef);
CGContextRelease(contextRef);
free(rawData);
UIImage *image = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
return image;
}
hooleyhoop的工作解决方案
将函数调用放入自动释放池中。
for (int i = 0; i < 1000; ++i) {
@autoreleasepool {
UIImage *img = [self createDummyImage:CGSizeMake(2000, 1600)];
}
}