Dav*_*rri 4 iphone memory-management cgimage ios5
我尝试通过填写自己的数据来创建UIImage.到目前为止一切正常.但是,如果我尝试多次调用此函数,它似乎会填满内存,直到应用程序崩溃.使用VM Tracker我发现脏内存增长到328MB,当应用程序崩溃时,290MB是CG图像内存.
我多次调用我的函数循环,从而启用ARC.图像非常大,但这应该不是问题,因为它适用于29次迭代.据我所知,脏内存应该再次被应用程序重用.是对的吗?那么为什么它会填满我的记忆呢?我该如何避免这个问题呢?
for(int i = 0; i < 1000; ++i) {
UIImage *img = [self createDummyImage:CGSizeMake(2000, 1600)];
}
Run Code Online (Sandbox Code Playgroud)
创建虚拟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;
}
Run Code Online (Sandbox Code Playgroud)
hooleyhoop的工作解决方案
将函数调用放入自动释放池中.
for (int i = 0; i < 1000; ++i) {
@autoreleasepool {
UIImage *img = [self createDummyImage:CGSizeMake(2000, 1600)];
}
}
Run Code Online (Sandbox Code Playgroud)
我想如果你在Allocations工具中查看'live'内存,你会发现你的内存正常用完 - 与脏VM无关.
这很可能是因为你有太多的内存等待自动释放.在弹出当前自动释放池之前,不会释放自动释放的对象 - 您试图将数百兆字节的对象添加到一个自动释放池中.
答案是管理自己的自动释放池,或者在一个事件循环中不做太多工作.
对不起,但我无法抗拒讽刺评论..在我看来,这在ARC之前会更加明显.
| 归档时间: |
|
| 查看次数: |
1576 次 |
| 最近记录: |