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{}
中,现在我看到它实际上是