swift:ARC: 如何释放对 UIImage 的所有引用

swift:ARC: how to release all references to an UIImage

我有一个 ios/swift 项目,我在滚动视图中放置了很多 UIImageView。我有多个滚动视图,我想确保在关闭一个时释放所有内存。到目前为止,如果我添加一个 UIImage,它会通过以下代码获得 16 个引用。如果我 运行 它在任何设备上 运行 内存不足并崩溃。

import UIKit

class ViewController: UIViewController
{

    var scrollView: UIScrollView?
    var backgroundView:UIImageView?
    var background:UIImage?

    override func viewDidLoad()
    {
        super.viewDidLoad()
        for i in 1 ..< 10000
        {
            print(i)
            scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: 1000, height: 1000))
            view.addSubview(scrollView!)

            if let backgroundPath = NSBundle.mainBundle().pathForResource("1", ofType: "jpg")
            {
                background = UIImage(contentsOfFile: backgroundPath)!
            }

            backgroundView = UIImageView(image: background)

            backgroundView?.frame = CGRect(x: 100, y: 500, width: 500, height: 500)
            scrollView?.addSubview(backgroundView!)

            print(CFGetRetainCount(background!))
            print(CFGetRetainCount(backgroundView!))
            print(CFGetRetainCount(scrollView!))

            scrollView!.contentSize = CGSize(width: 500, height: view.frame.height)

            backgroundView = nil
            scrollView = nil
            background = nil
        }
    }
}

如何让引用计数为零来释放内存?谢谢!

只有 16 个参考文献?此代码创建 9,999 个滚动视图(每次都将前一个留在视图层次结构中,但在下一次迭代时放弃对它的引用),每个都有自己的 1.jpg 副本,并且每个都作为子视图添加view。关于如何释放内存,您应该删除所有强引用,以及删除任何其他引用,例如视图层次结构。

因此,如果您想删除对图像的引用,您可以重置 image 属性 或 UIImageView,and/or 删除 UIImageView(或 UIScrollView)来自视图层次结构。

请注意,您将 backgroundViewscrollView 设置为 nil 的尝试删除了对它们的强引用,但之前调用了 addSubview,因此视图层次结构仍然具有对他们的强烈参考。如果你想摆脱一切,在将 scrollView 设置为 nil 之前,确保调用 scrollView.removeFromSuperview() 以将其从视图层次结构中删除。