绘制一系列UIImages和内存问题

时间:2013-11-30 19:22:45

标签: ios objective-c uiimage out-of-memory

我需要在彼此之上绘制一系列大型UIImages,我遇到了内存问题,我想知道是否有人有解决方案。

下面的代码为您提供了我的函数调用如何工作的示例。这些功能已经简化,以显示我的主要问题。

函数“generateImage”有一个for循环,它调用一个子类,该子类也返回从一系列路径生成的图像。我已经在调用周围放置了@autoreleasepools,以便生成的图像在使用后立即被释放,但这似乎不起作用,当arrayOfSubImages增长时,我遇到了内存问题。

-( UIImage *)   generateImage
{
    @autoreleasepool {

        UIGraphicsBeginImageContextWithOptions( CGSizeMake( 1000, 1000 ), NO, 0.0 );

        CGContextRef context = UIGraphicsGetCurrentContext();

        UIGraphicsPushContext(context);

        for ( SubImage *subImage in arrayOfSubImages ) {
            UIImage     *aImage = [ subImage imageFromPaths ];
            [ aImage drawAtPoint:CGPointZero ];
        }

        UIGraphicsPopContext();

        UIImage     *image = UIGraphicsGetImageFromCurrentImageContext();

        UIGraphicsEndImageContext();
        return image;
    }
}

从generateImage

调用的SubImage
-( UIImage *)   imageFromPaths
{
    @autoreleasepool {

        UIGraphicsBeginImageContextWithOptions( CGSizeMake( 1000, 1000 ), NO, 0.0 );

        CGContextRef context = UIGraphicsGetCurrentContext();

        UIGraphicsPushContext(context);


        for ( UIBezierPath *path in arrayOfPaths ) {
            [ path fill ];
        }


        UIGraphicsPopContext();

        UIImage     *image = UIGraphicsGetImageFromCurrentImageContext();

        UIGraphicsEndImageContext();
        return image;
    }
}

任何帮助将不胜感激

3 个答案:

答案 0 :(得分:2)

过去我遇到过类似的问题。尝试在for循环中添加@autoreleasepool ,因为您可能会通过在紧密循环中执行多次内存密集型操作来解决内存问题。即使循环包含在自动释放池中,内存也不会自动释放,直到循环结束 - 您需要释放每个单独的迭代。

答案 1 :(得分:1)

使用后将图像直接设置为nil应释放内存,如下所示:

-( UIImage *)   generateImage
{
    @autoreleasepool {

    UIGraphicsBeginImageContextWithOptions( CGSizeMake( 1000, 1000 ), NO, 0.0 );

    CGContextRef context = UIGraphicsGetCurrentContext();

    UIGraphicsPushContext(context);

    for ( SubImage *subImage in arrayOfSubImages ) {
        UIImage     *aImage = [ subImage imageFromPaths ];
        [ aImage drawAtPoint:CGPointZero ];
        aImage = nil;
    }

    UIGraphicsPopContext();

    UIImage     *image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();
    return image;
}

答案 2 :(得分:-1)

改为使用临时变量, 像:

UIimage * image=

您可以在.h文件中定义实例临时变量, 喜欢:

UIImage * _image;

然后在定义新图像的任何地方使用它,需要取消分配。 它可以保证您及时重置内存。

斯科特是对的。我忘记了这个问题。 Loop中的释放是关键