Swift 自我功能保留弱
Swift weak self function retention
如果我有一个引用 weak var weakSelf = self
的闭包,我可以通过 weakSelf
将该闭包更改为直接函数引用吗?
struct ClosureHolder {
let closure: () -> Void
}
class ClosureSource {
func hello() {
NSLog("hello")
}
func createWeakSelfWithinInnerClosureClosureHolder() -> ClosureHolder {
weak var weakSelf = self
return ClosureHolder(closure: {
weakSelf?.hello()
})
}
func createWeakSelfDotHelloClosureHolder() -> ClosureHolder {
weak var weakSelf = self
// The code below won't compile because weakSelf is an Optional.
// Once I unwrap the optional, I no longer have a weak reference.
// return ClosureHolder(closure: weakSelf.hello)
// this strongifies the weak reference. :(
return ClosureHolder(closure: weakSelf!.hello)
}
}
而不是 createWeakSelfWithinInnerClosureClosureHolder
,我更喜欢 createWeakSelfDotHelloClosureHolder
。
不,你不能。说 self.foo
(如果 foo
是一个方法)和说 MyClass.foo(self)
完全一样。以这种方式柯里化的方法总是保持对接收者对象的强引用。如果你想保持弱引用,那么你需要坚持使用 { weakSelf?.hello() }
方法。
如果我有一个引用 weak var weakSelf = self
的闭包,我可以通过 weakSelf
将该闭包更改为直接函数引用吗?
struct ClosureHolder {
let closure: () -> Void
}
class ClosureSource {
func hello() {
NSLog("hello")
}
func createWeakSelfWithinInnerClosureClosureHolder() -> ClosureHolder {
weak var weakSelf = self
return ClosureHolder(closure: {
weakSelf?.hello()
})
}
func createWeakSelfDotHelloClosureHolder() -> ClosureHolder {
weak var weakSelf = self
// The code below won't compile because weakSelf is an Optional.
// Once I unwrap the optional, I no longer have a weak reference.
// return ClosureHolder(closure: weakSelf.hello)
// this strongifies the weak reference. :(
return ClosureHolder(closure: weakSelf!.hello)
}
}
而不是 createWeakSelfWithinInnerClosureClosureHolder
,我更喜欢 createWeakSelfDotHelloClosureHolder
。
不,你不能。说 self.foo
(如果 foo
是一个方法)和说 MyClass.foo(self)
完全一样。以这种方式柯里化的方法总是保持对接收者对象的强引用。如果你想保持弱引用,那么你需要坚持使用 { weakSelf?.hello() }
方法。