代码之家  ›  专栏  ›  技术社区  ›  Simon Lundberg

以Swift追踪过度保留/释放

  •  0
  • Simon Lundberg  · 技术社区  · 7 年前

    SpatialIndex 用一个 [SpatialIndex?] 子节点的属性。我写了一个测试加速度结构的方法,就是找到离任意点最近的点。第一种方法是递归的,效果很好。然后我尝试实现一种基于循环的方法,这种方法也很好,但是速度慢了3倍,而且大部分时间都花在了retain/release调用上。

    问题是,我真的不明白为什么它需要比递归方法更多的retain/release调用,我也不知道如何跟踪实际的ARC'd。在这种情况下,引用计数占了大约一半的时间。至少可以说,这有点过分。

    当我搜索ARC问题时,我通常会找到与retention循环相关的东西。我真正想做的是有效地绕过整个系统,因为我知道树的内存布局无法更改。

    所以我的问题基本上是:当ARC引起性能问题时,跟踪它实际花费的时间引用计数的最佳选择是什么,我应该如何加快速度?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Ole Begemann    7 年前

    你可以使用 Unmanaged type 绕过特定对象的圆弧。我没试过这么多,但我想应该是这样的:

    1. 非受控

      let unmanagedObj = Unmanaged.passRetained(obj)
      
    2. 在临界区内,通过 非受控

      let obj = unmanagedObj.takeUnretainedValue()
      
    3. 在关键部分之后,释放对象:

      unmanagedObj.release()
      

    当然,这只在您控制需要将对象传递到的函数时才起作用,因为您必须将它们从获取对象更改为获取 非受控

    通过将对象图的不同部分切换到 非受控 .