我无法追踪保留周期。我认为这与我订阅活动的方式有关。伪代码是这样的:
override func viewDidLoad() {
func handleEvent() {
self.doSomething()
}
subscribe("eventName", block: handleEvent)
}
deinit {
unsubscribe("eventName")
}
这会为自我/我的ViewController创建一个保留周期吗?如果是这样,我怎么能绕过它呢?如果我使用了一个闭包,我可以使用[弱自我],但由于我传递了一个函数,无论如何都使用[弱自我]等价?
答案 0 :(得分:3)
长话短说,您的代码确实保留了参考。 (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)
答案 1 :(得分:2)
如果您从类中引用属性或方法,它将创建一个保留周期。
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!")
}
}