0

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

4

1 回答 1

2

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

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

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

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

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

    @autoreleasepool {
         ....
    }
于 2013-05-04T09:06:30.333 回答