ios - 将参数传递给实例方法以避免保留循环?

标签 ios swift automatic-ref-counting

我最近开始分析我用 swift 编写的一个 iOS 应用程序,并意识到与其他更广泛采用的 GC(如 Mark-And-Sweep)相比,ARC 有多么烦人。

Strong Reference Cycle 的最普遍原因之一是在传递给另一个对象的闭包中保留实例属性,同样由类保留。

例如,

  class MyClass {
    private let text = "hello world"
    private let anotherClass = AnotherClass()
    init() {
      addText() 
    }
    private func addText() {
      anotherClass.addText { return self.text }
    }
  }

通过将参数传递给方法而不是直接访问 self 可以避免像上面那样的循环保留。

class MyClass {
  private let text = "hello world"
  private let anotherClass = AnotherClass()
  init() { 
    addText(text)
  }
  private func addText(text:String) {
    anotherClass.addText { return text }
  }
}

第二种方法被认为是一种好的做法吗?

仅供引用,我知道可以使用捕获列表打破上面的保留周期。我只是对对内存泄漏更有弹性的模式感到好奇。

最佳答案

由于属性 let text ... 是一个常量,我认为第二种方法很好,可以被认为是最佳实践。

但是如果您对 var text ... 属性使用相同的方法,则行为会发生变化:

  • 在第一种方法中,闭包的执行将使用 text当前值,

  • 而在第二种方法中,闭包的执行将始终使用 text原始值。

关于ios - 将参数传递给实例方法以避免保留循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32247205/

相关文章:

android - 我可以同时使用 Parse 和 Firebase 吗?

ios - 在为 Cordova iOS 应用程序构建 Appium 测试框架时寻找选择器的任何更简单的方法

IOS 8 选项卡栏项目背景颜色

ios - 在 tableView.reloadData() 之后,通用函数不会更新 tableview 单元格中标签的值

objective-c - Xcode 5 和 mavericks 上的 ARC 问题

ios - DateComponentsFormatter 显示前导零

iOS 更改按钮图像以填满 iphone 3.5 英寸和 iphone 4 英寸的屏幕

ios - Swift 3 游戏按钮按下循环

ios - 在 xcode 中禁用整个嵌套项目的 ARC

ios - 尽管 block 已被复制,但 block 正在阻止释放