【发布时间】:2017-05-15 19:32:01
【问题描述】:
抱歉,但我知道这是一个非常愚蠢的问题,而且我已经有点“知道”答案,但我需要有人清楚地向我解释为什么答案是这样的。
最近,在对各种内存问题进行了一些噩梦般的调试之后,我对代码中的保留周期和内存泄漏变得有点着迷/偏执,所以将来我想将它们扼杀在萌芽状态。但是在阅读和学习了很多关于 ARC 和 Swift 中的保留循环之后,虽然它是有道理的,但我仍然没有足够的“直觉”或自然感觉,我没有信心我能找到一个,或者缺少一个,因为我正在编码。所以我开始变得有点偏执,我甚至在没有意识到的情况下用基本的东西创建了保留周期。
那么,考虑到这一点,为什么任何使用在其外部声明的变量的普通函数不创建保留循环?例如:
class someClass {
let a = "I'm letter a"
let moreLetters = addLetters()
func addLetters () -> String {
let newString = a + "bcdefg"
return newString
}
}
在这种情况下,self.moreLetters 引用函数 addLetters,然后常量 self.a 是来自函数 addLetters 的引用。那么,如果我不捕获弱/无主的自我,这会创建一个保留周期吗?对我来说,这么简单的事情会导致问题似乎很荒谬……或者是吗?在嵌套函数中怎么样,像这样:
func someFunction () -> String {
let a = "I'm letter a"
func addLetters () -> String {
let newString = a + "bcdefg"
return newString
}
let moreLetters = addLetters()
return moreLetters
}
这也会创建一个保留周期吗? (是的,我知道这是一种执行简单任务的复杂方式;我只是以这段代码为例来说明我的观点)。
我是否变得超级偏执并且严重过度思考事情?
【问题讨论】:
-
let moreLetters = addLetters()编译错误。 -
在 Swift 中,字符串是值类型而不是引用类型,因此在您的示例中不会出现引用循环。你能用引用类型重新表述你的问题吗?
标签: ios swift memory-leaks retain-cycle