使用函数作为闭包会保留自我吗?
Does using a function as a closure retain self?
我无法追踪保留周期。我认为这与我订阅事件的方式有关。伪代码是这样的:
override func viewDidLoad() {
func handleEvent() {
self.doSomething()
}
subscribe("eventName", block: handleEvent)
}
deinit {
unsubscribe("eventName")
}
这会为自己/我的 ViewController 创建一个保留周期吗?如果是这样,我该如何解决?如果我使用的是闭包,我可以使用 [weak self],但由于我正在传递一个函数,是否可以使用等效的 [weak self]?
长话短说,您的代码确实保留了引用。 (handleEvent->viewDidLoad->self), http://blog.xebia.com/function-references-in-swift-and-retain-cycles/ 有一些通用的策略来避免这个问题。我的建议是创建一个函数引用,而不是声明一个函数:
let eventHandler: () -> () = { [weak self] in
self?.doSomething()
}
subscribe("eventName", block: eventHandler)
如果您从 class 内部引用 属性 或方法,它将创建一个保留周期。
class SomeClass {
val a: (block: (() -> ()) -> ()) = ...
func run() {
func b() {
print("Hello, World!")
}
func c() {
self.someMethod()
}
func d() { [weak self]
self?.someMethod()
}
a(block: b) // no retain cycle
a(block: c) // retain cycle
a(block: d) // no retain cycle
}
func someMethod() {
print("Hello, World!")
}
}
我无法追踪保留周期。我认为这与我订阅事件的方式有关。伪代码是这样的:
override func viewDidLoad() {
func handleEvent() {
self.doSomething()
}
subscribe("eventName", block: handleEvent)
}
deinit {
unsubscribe("eventName")
}
这会为自己/我的 ViewController 创建一个保留周期吗?如果是这样,我该如何解决?如果我使用的是闭包,我可以使用 [weak self],但由于我正在传递一个函数,是否可以使用等效的 [weak self]?
长话短说,您的代码确实保留了引用。 (handleEvent->viewDidLoad->self), http://blog.xebia.com/function-references-in-swift-and-retain-cycles/ 有一些通用的策略来避免这个问题。我的建议是创建一个函数引用,而不是声明一个函数:
let eventHandler: () -> () = { [weak self] in
self?.doSomething()
}
subscribe("eventName", block: eventHandler)
如果您从 class 内部引用 属性 或方法,它将创建一个保留周期。
class SomeClass {
val a: (block: (() -> ()) -> ()) = ...
func run() {
func b() {
print("Hello, World!")
}
func c() {
self.someMethod()
}
func d() { [weak self]
self?.someMethod()
}
a(block: b) // no retain cycle
a(block: c) // retain cycle
a(block: d) // no retain cycle
}
func someMethod() {
print("Hello, World!")
}
}