使用函数作为闭包会保留自我吗?

Rol*_*ien 5 retain-cycle swift

我在跟踪保留周期时遇到问题。我认为这与我订阅事件的方式有关。伪代码是这样的:

override func viewDidLoad() {
   func handleEvent() {
     self.doSomething()
   }

   subscribe("eventName", block: handleEvent)
}

deinit {
    unsubscribe("eventName")
} 
Run Code Online (Sandbox Code Playgroud)

这会为自己/我的 ViewController 创建一个保留周期吗?如果是这样,我该如何解决?如果我使用的是闭包,我可以使用 [weak self],但是由于我正在传递一个函数,所以无论如何都可以使用 [weak self] 等价物吗?

Str*_*ers 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)
Run Code Online (Sandbox Code Playgroud)