繁体   English   中英

快速内存管理

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM