【问题标题】:Swift using function parameter inside closureSwift在闭包内使用函数参数
【发布时间】:2015-07-24 11:47:50
【问题描述】:

我只是想在没有内存泄漏的情况下在 swift 闭包中使用函数参数,所以我只想确认如果我按照以下方式进行操作会不会有任何与内存相关的问题?请告诉我

func someMethod(someValue: String) {
    weak var weakSelf = self
    var copyOfSomeValue: String? = someValue.copy() as? String
    self.someOtherMethodWithCompletion(completionHandler: { () -> Void in
        if let strongSelf = weakSelf, let originalValue = copyOfSomeValue {
            strongSelf.updateMyViewWithText(originalValue)
        }
    })
}

【问题讨论】:

    标签: swift memory closures


    【解决方案1】:

    Stringvalue type。即使通过引用关闭capture 它们,也无需复制,除非您要在捕获后更改someValue。即使这样,您最好还是使用捕获列表[someValue],当您需要声明[weak self] 时也会使用这些列表。

    使用weakunowned 是根据情况使用的,请阅读here

    func someMethod(someValue: String) {
        someOtherMethodWithCompletion { [weak self] in
            self?.updateMyViewWithText(someValue)
        }
    }
    

    【讨论】:

      【解决方案2】:

      使用 swift 您应该使用 [unowned self] 并正常使用 swift,例如:

      func someMethod(someValue: String) {
          var copyOfSomeValue: String? = someValue.copy() as? String
          self.someOtherMethodWithCompletion(completionHandler: { () ->
              [unowned self]
               in
              if let originalValue = copyOfSomeValue {
                  self.updateMyViewWithText(originalValue)
              }
          })
      }
      

      您应该只对可能导致引用循环的变量使用弱或无主。它们之间的区别是:

      只要对弱引用有效,就使用弱引用 在其生命周期的某个时刻为零。相反,使用无主 当您知道引用永远不会为零时引用 已在初始化时设置

      【讨论】:

      • 那么我可以对闭包内的任何实例变量使用 unowned 吗?
      猜你喜欢
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      • 2015-07-14
      • 2013-06-21
      • 1970-01-01
      • 2017-06-30
      • 1970-01-01
      相关资源
      最近更新 更多