为什么这个func中的微小内存泄漏与UIGraphicsBeginImageContext相关?

时间:2013-05-04 09:03:02

标签: ios objective-c memory memory-leaks

我有一个简单的函数来创建一个特殊大小的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上崩溃;( 简单的功能有什么问题吗?

1 个答案:

答案 0 :(得分:2)

当使用没有本地自动释放池的大型循环时,这是典型的。

由于你的函数不会将控制权返回给主循环,因此操作系统有机会耗尽自动释放的对象池,因此内存占用量会无限增长。

这将是一种使用本地自动释放池的方法,并在循环中的每次迭代中释放不需要的对象(尽管对于这样的“研究案例”可能是一种过度杀伤):

for(int i=0;i<3000;i++)
{
    NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];
    UIImage* im = [self imageWithSize:CGSizeMake(256,192)];
    [loopPool release];
}

或者您可以使用更新的语法:

    @autoreleasepool {
         ....
    }