1

我正在使用 ARC 为 iOS 5 构建应用程序,但我似乎遇到了一些内存问题。基本上,它对显示器的一部分进行屏幕截图,将 UIImage 放在一个 MSMutableArray 中,然后将屏幕截图拼凑成一个大图像。现在的问题是,在这样做了几次之后,操作系统由于高内存使用而关闭了应用程序。

这是将 UIImage 拼凑在一起的片段:

UIImage* finalImage = nil;
//join the screenshot images together
UIGraphicsBeginImageContext(CGSizeMake(collage.width, collage.height));
{
    int hc = 0;
    for(UIImage *img in imageArr)
    {
        NSLog(@"drawing image at:: %i", hc);
        [img drawAtPoint:CGPointMake(0, hc)];
        hc+=img.size.height;
        img = nil;
    }

    //NSLog(@"creating finalImage");
    finalImage = UIGraphicsGetImageFromCurrentImageContext();
}
UIGraphicsEndImageContext();
//do something with the combined image
//remove all the objects
[imageArr removeAllObjects];
//reset class instance
[self setImageArr: [[NSMutableArray alloc] init]];

它们是我可以使用的任何其他替代方案,因此没有使用太多内存吗?也许将 CGImageRef 存储在数组中?上述代码是否存在任何潜在的内存泄漏?

任何提示,指针将不胜感激。

谢谢。

4

4 回答 4

1

[imageArr removeAllObjects];将从数组中删除对象。无需再次重置阵列

 [self setImageArr: [[NSMutableArray alloc] init]];

通过这样做,您分配了一个 NSMutableArray 对象而不是释放它。

删除线试试[self setImageArr: [[NSMutableArray alloc] init]];

于 2012-04-06T18:55:16.010 回答
0

确保你分配并初始化 setImageArr

if (setImageArr == nil){
setImageArr = [[NSMutableArray alloc]init];
}
else
{
[setImageArr removeAllObjects];
}

或使用(如果您想从现有数组初始化):

NSMutableArray *setImageArr = [[NSMtableArray]initWithArray:arrayOfImages];
于 2012-04-06T18:40:05.593 回答
0

因为你说它之后会有内存问题doing this a couple of times。那么你如何NSAutoreleasePool在你的方法之后使用强制系统释放对象,示例如下:

@autoreleasepool {
    UIImage* finalImage = nil;
    //join the screenshot images together
    UIGraphicsBeginImageContext(CGSizeMake(collage.width, collage.height));
    {
        int hc = 0;
        for(UIImage *img in imageArr)
        {
            NSLog(@"drawing image at:: %i", hc);
            [img drawAtPoint:CGPointMake(0, hc)];
            hc+=img.size.height;
            img = nil;
        }
        finalImage = UIGraphicsGetImageFromCurrentImageContext();
    }
    UIGraphicsEndImageContext();
    //do something with the combined image
    //remove all the objects
    [imageArr removeAllObjects];
    //reset class instance
    [self setImageArr: [[NSMutableArray alloc] init]];
}

而且我也怀疑您的其他代码中是否存在任何内存泄漏问题。使用 ARC 并不意味着没有内存泄漏问题,也许您将许多无用的对象存储在全局变量等中。

也许您应该使用 Instruments 来监控内存以找出内存的去向。

于 2012-04-07T04:40:19.340 回答
0

原来 imageArr 正在被正确清除。程序中的其他地方似乎存在内存问题。

于 2012-04-09T13:24:17.050 回答