在UIImage和UIImageViews中释放Swift中的内存

时间:2015-02-25 12:52:35

标签: ios swift uiimageview uiimage autorelease

我正在开发一个由多个视图组成的应用程序。每个视图都包含几个由UIImageView.animate组成的动画。我遇到的问题是每次打开一个新的View内存都没有减少,在iPhone 4上增加到320 Mb,retonrando内存错误"由于内存错误而终止。"我找不到如何在Swift中自动释放内存,因为在Objective-C中,如果我能看到它更适合使用 imageWithContentOfFile而不是named:...

我使用它将图像添加到UIImage对象:

var leftCorner: UIImage =  UIImage(named: "navegacio_esquerra")!

要在UIImageView.animationImages中添加图像数组,请使用:

var thirdSisterHeadList: [Int] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 33, 32, 33, 34, 33, 32, 33, 34, 33, 32, 33, 34, 33, 32, 33, 34, 33, 66, 67, 68]

        var thirdSisterHeadImageList: [UIImage] = []

        for i in thirdSisterHeadList{
            var imageName = "pantalla_12_03_caps_c_\(i).png"
            thirdSisterHeadImageList += [UIImage(named: imageName)!]
        }
thirdSisterHead.animationImages = thirdSisterHeadImageList

1 个答案:

答案 0 :(得分:1)

此评论没有意义

  

我无法找到如何在Swift中自动释放内存,因为在Objective-C中如果我能看到使用imageWithContentOfFile而不是命名更为明智:。

Swift和ObjC以相同的方式管理内存。对于这类工作,您肯定希望使用named:,因为这样可以让系统为您执行更好的内存管理。当内存紧张时,它可以自动清除不需要的表示。

从仪器中的Allocations仪器开始。确保这些图像实际上是您的记忆所在的位置。情况很可能如此,但是通过内存分析,您需要数据,而不是猜测。

您不止一次使用相同的图像。这可能很好,但你应该验证pantalla_12_03_caps_c_33.png的每个实例实际上都是相同的UIImage(这真的应该自动适用于你,所以我不强烈怀疑这里有问题。)

要为图像设置动画,它会希望它们都在内存中解码。即便如此,iPhone 4上30张图像的320MB听起来也不错。每个图像大约10MB。全屏iPhone 4图像应该更像2MB(640 * 960 * 4)。如果您使用的是非常高分辨率的图像,您可能希望为不同的设备提供多种分辨率,这样就不必处理那些将要丢弃的数据。

内存未被恢复的事实几乎肯定意味着您的视图未被释放。这表明您有一个保留循环,或者您可能一直在调用addSubview:来添加图像视图而不删除旧的图像视图(这是一个非常常见的错误)。覆盖视图控制器中的dealloc,并确保它在您预期时消失。确保您没有抓住此视图控制器之外的thirdSisterHead

无关的旁注:你的for-in循环真的是这么做的。此代码可以简化,所有变量都替换为常量,无需为[UIImage]创建临时+=

let thirdSisterHeadList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 33, 32, 33, 34, 33, 32, 33, 34, 33, 32, 33, 34, 33, 32, 33, 34, 33, 66, 67, 68]
let thirdSisterHeadImageList = thirdSisterHeadList.map { 
    UIImage(named: "pantalla_12_03_caps_c_\($0).png")! 
}
self.thirdSisterHead.animationImages = thirdSisterHeadImageList