[英]Swift Memory Management
我正在使用Swift开发应用程序,并且来自非弧线的Objective-C背景。 我遇到了内存问题。 因此,我在ViewControllers中实现了deinit
。 他们没有一个被打来。 一些代码示例:
@objc protocol ServerDelegate {
@objc optional func onUpdateComplete ()
}
var delegate_ : ServerDelegate?
我四处搜寻,发现我的所有代表都受到了强烈的推荐。 因此,我将它们设为弱引用,例如:
@objc protocol ServerDelegate : class {
@objc optional func onUpdateComplete ()
}
weak var delegate_ : ServerDelegate?
现在为每个ViewController调用deinit
。
但是,当我看到内存时,从导航控制器中弹出视图控制器时,它的确释放了。 例如,在第一个场景中,我分配了10 MB的内存,我推了一个视图控制器,内存增加到15 MB。 现在,当我弹出它时,将调用deinit
,但是这额外的5 MB无法释放。 但是如果我再推一次。 内存不会增加到20 MB。 它停留在15 MB。 为什么会这样呢? 这正常吗? 图像是否已缓存且未发布? 弹出视图控制器时可以手动释放它们吗? 谢谢。
根据UIImage.init(named:)
的文档,有一个用于图像的系统缓存; 您无法手动刷新它,但是Apple的设计意图是,如果您这样做,您将永远不会获得任何好处-像所有NSCache
类型的缓存一样,如果内存变少,它将自动刷新自身。 因此,与此同时,所有刷新都将实现更少的缓存命中,并减少刷新所需的处理器周期。
该文档建议使用imageWithContentsOfFile:
如果要避免缓存,但是如果要从XIB或Storyboard加载或从中加载,则没有足够的直接控制权来主张影响力。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.