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

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!")
  }
}