我只想在没有内存泄漏的情况下使用swift闭包内的函数参数,所以我只想确认我是否会以下列方式存在任何与内存相关的问题?请让我知道
func someMethod(someValue: String) {
weak var weakSelf = self
var copyOfSomeValue: String? = someValue.copy() as? String
self.someOtherMethodWithCompletion(completionHandler: { () -> Void in
if let strongSelf = weakSelf, let originalValue = copyOfSomeValue {
strongSelf.updateMyViewWithText(originalValue)
}
})
}
答案 0 :(得分:1)
使用swift,您应该使用[unowned self]
并正常使用swift,例如:
func someMethod(someValue: String) {
var copyOfSomeValue: String? = someValue.copy() as? String
self.someOtherMethodWithCompletion(completionHandler: { () ->
[unowned self]
in
if let originalValue = copyOfSomeValue {
self.updateMyViewWithText(originalValue)
}
})
}
你应该对可能导致参考周期的变量使用弱或无主。它们之间的区别是:
只要对该引用有效,就使用弱引用 在其一生中的某个时刻没有。相反,使用无主 当你知道引用永远不会为零时引用 已在初始化期间设置
答案 1 :(得分:1)
String
是value type。尽管通过引用将capture闭包,但除非您在捕获后要更改someValue
,否则无需复制。即便如此,您最好还是使用捕获列表[someValue]
,这些列表也会在您需要声明[weak self]
时使用。
使用weak
或unowned
是情境化的,请阅读here。
func someMethod(someValue: String) {
someOtherMethodWithCompletion { [weak self] in
self?.updateMyViewWithText(someValue)
}
}