使用ARC进行ALAssets枚举的iOS编程内存问题

时间:2013-12-25 16:43:55

标签: memory automatic-ref-counting enumeration alassetslibrary

我想列举我的相册,但是当我在我的设备上测试该应用时,应用程序会在30秒后崩溃。当我使用Instrument时,我发现ARC不会自动释放资产,因此每次处理图像时,它都会分配图像大小。我的主要目标是仅显示设备的屏幕截图。所以假设我有1000张照片,30张图片后我得到30MB的分配,这会导致崩溃。如何明确释放内存?

这是我的代码:

[self.assetsGroup enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {

    if (result) {

        ALAssetRepresentation* representation = [result defaultRepresentation];

        // Retrieve the image orientation from the ALAsset
        UIImageOrientation orientation = UIImageOrientationUp;

        NSNumber* orientationValue = [result valueForProperty:@"ALAssetPropertyOrientation"];

        if (orientationValue != nil) {
            orientation = [orientationValue intValue];
        }

        CGFloat scale  = 1;
        UIImage* image = [UIImage imageWithCGImage:[representation fullResolutionImage]
                                             scale:scale orientation:orientation];

        if ( image.size.height/2==screenHeight && image.size.width/2==screenWidth)
            [self.assets addObject:result];
    }
}];

我认为默认表示会导致malloc。

提前致谢...

1 个答案:

答案 0 :(得分:2)

您已经发现UIImage对象在创建时可以占用 lot 的内存。

为什么不使用ALAsset为您提供的不会占用内存的API,而不是创建UIImage对象。例如,您可以获取图像dimensions(我已经为您链接了Apple文档)。

此外,这一行:

if ( image.size.height/2==screenHeight && image.size.width/2==screenWidth)

对我来说似乎有点危险。除非您控制所有正在加载的图像,否则任何全分辨率图像很可能与屏幕高度和宽度的1/2完全不同。