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

时间:2017-12-20 17:38:24

标签: swift retain-cycle

我无法追踪保留周期。我认为这与我订阅活动的方式有关。伪代码是这样的:

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

   subscribe("eventName", block: handleEvent)
}

deinit {
    unsubscribe("eventName")
} 

这会为自我/我的ViewController创建一个保留周期吗?如果是这样,我怎么能绕过它呢?如果我使用了一个闭包,我可以使用[弱自我],但由于我传递了一个函数,无论如何都使用[弱自我]等价?

2 个答案:

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