Ios DismissViewController未取消使用缓存映像释放内存。敏捷的

Ios DismissViewController未取消使用缓存映像释放内存。敏捷的,ios,swift,memory-management,uiimageview,Ios,Swift,Memory Management,Uiimageview,我的问题标题可能有点不尽如人意,但基本问题是: 我提供了一个添加了uicrollview的UIViewController。在滚动视图中,我使用UIImageView布局了大量预加载的图像,其中图像本身从我的图像资产中缓存。图像非常大,因为它们的质量非常好。当显示UIViewController时,会分配大量内存来布局图像,但当使用dismissViewControllerAnimated关闭VC时,看起来VC中的所有内存都被释放,除了图像中的内存(这实际上是使用的大部分内存) 我尝试将图像存储

我的问题标题可能有点不尽如人意,但基本问题是:

我提供了一个添加了
uicrollview
UIViewController
。在滚动视图中,我使用
UIImageView
布局了大量预加载的图像,其中图像本身从我的图像资产中缓存。图像非常大,因为它们的质量非常好。当显示
UIViewController
时,会分配大量内存来布局图像,但当使用
dismissViewControllerAnimated
关闭VC时,看起来VC中的所有内存都被释放,除了图像中的内存(这实际上是使用的大部分内存)

我尝试将图像存储在可选图像视图数组中,如:
[UIImageView?]
,然后在调用VC之前,对每个图像调用
removeFromSuperview
,然后设置为
nil

问题是无论我做什么,内存永远不会释放。当禁用
UIViewController
时,如何确保用于这些映像的内存被正确释放

以下是
UIImageView
的布局方式:

    for i in 0 ..< preLoadedImageNames.count {

        let contentWidth:CGFloat = min(self.view.bounds.width, self.view.bounds.height)/3
        let contentHeight:CGFloat = height

        let content:UIView = UIView()
        scroll.addSubview(content)
        content.translatesAutoresizingMaskIntoConstraints = false
        let contentHeightConstraint:NSLayoutConstraint = NSLayoutConstraint(item: content, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: contentHeight)
        let contentWidthConstraint:NSLayoutConstraint = NSLayoutConstraint(item: content, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: contentWidth)
        let contentTop:NSLayoutConstraint = NSLayoutConstraint(item: content, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: scroll, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 0)
        let contentLeft:NSLayoutConstraint = NSLayoutConstraint(item: content, attribute: NSLayoutAttribute.Left, relatedBy: NSLayoutRelation.Equal, toItem: scroll, attribute: NSLayoutAttribute.Left, multiplier: 1, constant: contentWidth*CGFloat(i))
        scroll.addConstraints([contentHeightConstraint, contentWidthConstraint, contentTop, contentLeft])

        let imageHeight:CGFloat = contentHeight*0.90
        let imageWidth:CGFloat = contentWidth*0.90

        let thumbnail:UIImageView = UIImageView()
        content.addSubview(thumbnail)
        thumbnail.image = UIImage(named: preLoadedImageNames[i])
        thumbnail.contentMode = UIViewContentMode.ScaleAspectFit
        thumbnail.frame = CGRect(x: contentWidth/2 - imageWidth/2, y: contentHeight/2 - imageHeight/2, width: imageWidth, height: imageHeight)

        images.append(thumbnail)

        let tap:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(ViewController.quickStartTapped(_:)))
        content.addGestureRecognizer(tap)
        self.quickStartTaps.append(tap)

        scroll.contentSize.width += contentWidth

    }
0中的i的
我有什么地方做错了吗?为什么在视图控制器关闭时,用于布局这些图像的内存没有被释放


非常感谢您的帮助。

您是否已验证您的视图控制器是否已被除名?您可以添加一个
deinit{}
方法并确保。@kleezy-这是个好主意…实际上,
deinit
没有被调用。我不知道为什么…查找诸如对拥有视图控制器的对象的非弱引用,或引用自身的块之类的内容。这样的事情通常会导致这样的内存泄漏。另外,无论您从何处展示视图控制器,它是否仍然有一个变量在被撤销后引用VC?@kleezy-嘿,我实际上错了,
deinit
正在被调用,只是出于某种原因,如果我插入断点,它不会停在那里,但没有执行任何实际的代码。所以我把一个简单的
print()
调用放在
deinit{}
中,现在我看到它实际上被调用了。因此VC实际上是被反初始化的,但是为这些
UIImageView
s分配的内存没有被释放。我在挠头。@kleezy-为了回答你的问题,对于向视图控制器显示内存泄漏的VC,我确实有一个引用它的变量,但它是一个可选值,我在解雇后立即将其设置为
nil
。所以它的设置类似于
var viewController:UIViewController
然后,在我调用
dismissViewControllerAnimated
之后,在完成块中我会说
viewController=nil
您是否验证了您的视图控制器实际上正在被取消身份验证?您可以添加一个
deinit{}
方法并确保。@kleezy-这是个好主意…实际上,
deinit
没有被调用。我不知道为什么…查找诸如对拥有视图控制器的对象的非弱引用,或引用自身的块之类的内容。这样的事情通常会导致这样的内存泄漏。另外,无论您从何处展示视图控制器,它是否仍然有一个变量在被撤销后引用VC?@kleezy-嘿,我实际上错了,
deinit
正在被调用,只是出于某种原因,如果我插入断点,它不会停在那里,但没有执行任何实际的代码。所以我把一个简单的
print()
调用放在
deinit{}
中,现在我看到它实际上是