如何使用ARC手动保留Swift?

时间:2017-01-08 03:06:20

标签: swift swift3 automatic-ref-counting retain swift3.0.2

我在iOS应用中使用Swift 3和ARC,我想手动保留一个对象。

我试过了object.retain(),但是Xcode说它在ARC模式下无法使用。有没有另外一种方法可以做到这一点,告诉Xcode我知道我在做什么?

长版:

我有一个LocationTracker类,它将自己注册为CLLocationManager的委托。当用户的位置发生变化时,它会更新名为location的静态变量。我的代码的其他部分需要位置访问此静态变量,而不需要或不需要对LocationTracker实例的引用。

这种设计的问题在于代理人没有被保留,因此在CLLocationManager向其发送消息时会释放LocationTracker,从而导致崩溃。

我想在设置为委托之前手动增加LocationTracker的引用计数。无论如何,对象永远不会被释放,因为只要应用程序正在运行,就应该监视该位置。

我找到了一个解决方法,即有一个静态变量'实例'保留对LocationTracker的引用。我认为这种设计不够优雅,因为我永远不会使用'实例'变量。我可以摆脱它并明确增加引用计数吗?

这个问题不像声称的那样重复,因为other question与Objective-C有关,而这个问题与Swift有关。

3 个答案:

答案 0 :(得分:2)

这很容易通过withExtendedLifetime(_:_:)函数来完成。从文档中:

  

在评估闭包的同时确保闭包返回之前不会破坏给定实例。

干杯!

答案 1 :(得分:1)

该解决方案原来是重新启用keep()和release():

extension NSObjectProtocol {
  /// Same as retain(), which the compiler no longer lets us call:
  @discardableResult
  func retainMe() -> Self {
    _ = Unmanaged.passRetained(self)
    return self
  }

  /// Same as autorelease(), which the compiler no longer lets us call.
  ///
  /// This function does an autorelease() rather than release() to give you more flexibility.
  @discardableResult
  func releaseMe() -> Self {
    _ = Unmanaged.passUnretained(self).autorelease()
    return self
  }
}

答案 2 :(得分:0)

在ARC下,唯一的解决方案是在某处保留强大的参考。您当前的实施实际上是最佳解决方案。让您的位置跟踪器类保持自己对自身的引用,以确保它可以保持。

有多种方法可以实现您正在执行的操作,但无法在ARC下调用retain