我有一个简单的函数来创建一个特殊大小的UIImage:
- (UIImage*)imageWithSize:(CGSize) imSize
{
UIGraphicsBeginImageContext( imSize );
float r = 0.5f;
float g = 0.5f;
float b = 0.5f;
CGContextRef cxt = UIGraphicsGetCurrentContext();
CGContextSetRGBStrokeColor(cxt, r, g, b, 1.0);
CGContextSetRGBFillColor(cxt, r,g,b, 1.0);
CGContextFillRect(cxt, CGRectMake(0.0, 0.0, imSize.width, imSize.height));
UIImage* retImg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return retImg;
}
然后我用这种方式多次调用它(我正在使用ARC):
for(int i=0;i<3000;i++)
{
UIImage* im = [self imageWithSize:CGSizeMake(256,192)];
}
它会多次收到内存警告,然后在我的iPhone4上崩溃;( 简单的功能有什么问题吗?
答案 0 :(得分:2)
当使用没有本地自动释放池的大型循环时,这是典型的。
由于你的函数不会将控制权返回给主循环,因此操作系统有机会耗尽自动释放的对象池,因此内存占用量会无限增长。
这将是一种使用本地自动释放池的方法,并在循环中的每次迭代中释放不需要的对象(尽管对于这样的“研究案例”可能是一种过度杀伤):
for(int i=0;i<3000;i++)
{
NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];
UIImage* im = [self imageWithSize:CGSizeMake(256,192)];
[loopPool release];
}
或者您可以使用更新的语法:
@autoreleasepool {
....
}