关于 Swift for-loop 的内存管理问题

Posted

技术标签:

【中文标题】关于 Swift for-loop 的内存管理问题【英文标题】:Memory management issue about Swift for-loop 【发布时间】:2020-12-22 05:43:24 【问题描述】:

我接管了一些遗留代码,有这样的代码sn-p

let albumGroups = data.getJSONArray("groups")
let groupNum = albumGroups.length()
var album: JSONObject

for i in 0..<groupNum

    album = albumGroups.getJSONObject(i)
    orderSummary.album.name[i] = album.getString("name")

当应用程序在调试模式下构建时,它可以正常运行。 但是如果它是在Release模式下构建的,它会在i为1时在album.getString("name")崩溃。错误表明专辑变量已被释放。

我尝试在启用 Address Sanitizer 标志的情况下运行该应用程序。

我的问题是,据我所知,专辑变量超出了循环的范围,为什么它在第一个循环结束后被释放?

【问题讨论】:

【参考方案1】:

检查orderSummary.album 不是弱引用。如果是,则您在第 1 行初始化的 Album 将立即销毁,这将解释当您尝试设置 orderSummary.album.name[i] 时发生的崩溃。

【讨论】:

那行代码可能有误导性,我已经删除了。

以上是关于关于 Swift for-loop 的内存管理问题的主要内容,如果未能解决你的问题,请参考以下文章

尽管包含更多条目,但数组仅在 for-loop 之后向 Struct 添加单个条目 - Swift/Xcode

Swift 管理内存

如何通过 ViewControllers 管理和释放内存

Swift 内存管理与循环引用问题(weakunowned)

Swift2.0(17)内存管理ARC

Swift 内存管理与异常处理