gpt4 book ai didi

ios - 快速内存管理

转载 作者:行者123 更新时间:2023-11-28 16:08:23 25 4
gpt4 key购买 nike

我正在用 Swift 开发一个应用程序,我来自非 arc Objective-C 背景。我遇到了内存问题。因此,我在我的 ViewController 中实现了 deinit。他们都没有接到电话。一些代码示例:

@objc protocol ServerDelegate {
@objc optional func onUpdateComplete ()
}

var delegate_ : ServerDelegate?

我四处搜索,发现我所有的委托(delegate)都设置为强引用。所以,我给它们做了弱引用,比如:

@objc protocol ServerDelegate : class {
@objc optional func onUpdateComplete ()
}

weak var delegate_ : ServerDelegate?

现在为每个 ViewController 调用 deinit

但是,当我看到内存时,当我从导航 Controller 中弹出一个 View Controller 时,它确实被释放了。例如,在第一个场景中,我分配了 10 MB 的内存,我推送了一个 View Controller ,内存增加到 15 MB。现在,当我弹出它时,将调用 deinit,但不会释放这额外的 5 MB。但是,如果我再次插入它。内存不会增加到 20 MB。它保持在 15 MB。为什么会这样?这是正常的吗?图像是否被缓存而不被释放?我可以在弹出 View Controller 时手动释放它们吗?谢谢。

最佳答案

根据 UIImage.init(named:) 的文档,有图像的系统缓存;你不能手动刷新它,但 Apple 的设计意图是,如果你可以这样做,你永远不会从中获得任何好处——就像所有 NSCache 类型的缓存一样,如果内存变得稀缺,它会自动刷新自己.因此,与此同时,刷新将实现的所有结果都将减少缓存命中和刷新所需的处理器周期支出。

文档建议使用 imageWithContentsOfFile: 如果您想避免缓存,但如果您正在从 XIB 或 Storyboard 加载或正在加载,那么您没有足够的直接控制来断言影响.

关于ios - 快速内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39902140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com