gpt4 book ai didi

ios - 此代码是否存在内存问题?

转载 作者:行者123 更新时间:2023-11-28 07:06:10 26 4
gpt4 key购买 nike

Swift 的新手,我想知道我是否必须(可能)处理这段代码中与我在 Objective-C 中处理的相同的问题:

var itemB = EditableItem(title: "Item J")
itemB.onReturn = {(value) in
var s = itemB.title
println(value)
}

闭包引用了 itemB 并且 itemB 引用了闭包。这是否会导致循环引用并因此导致 Swift 中的内存泄漏,或者 Swift 是否足够聪明,可以使 itemB 成为闭包内的弱变量?

如果没有,我该如何解决?

最佳答案

不,只要 itemB 设置在闭包外,闭包内的 itemB 就存在。

例如,您可以在 Playground 中对此进行测试。

假设我们有这个类映射到您的示例:

Import Foundation
class EditableItem {
var title = ""
var onReturn: ((String)->Void)?

init(title: String) {
self.title = title
}

deinit {
println("Deinit")
}
}

现在我们运行类似于您的代码:

// Using optional so that I can set it do nil = will dealloc
var itemB:EditableItem? = EditableItem(title: "Item J")
itemB!.onReturn = {(value) in
var s = itemB!.title
println(value)
}

// Execute to make sure anything would retain
itemB!.onReturn!("data")
// var is set to nil, same variable inside the closure
itemB = nil // Deinit will run

保留变量的相同示例:

var retainer:EditableItem? = nil

var itemB:EditableItem? = EditableItem(title: "Item J")
itemB!.onReturn = {(value) in
retainer = itemB!
println(value)
}

// If onReturn() would not be executed, itemB would not be retained
itemB!.onReturn!("data")
// deinit will not be called
itemB = nil

以及使引用变弱的示例:

var retainer:EditableItem? = nil

var itemB:EditableItem? = EditableItem(title: "Item J")
// Make sure retainer is weak
itemB!.onReturn = { [weak retainer](value) in
retainer = itemB!
println(value)
// retainer is set here..
}
// retainer is nil here..
itemB!.onReturn!("data")
// retainer is nil here as well..
itemB = nil // And this will deinit

关于ios - 此代码是否存在内存问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30563104/

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