我在iOS应用程序中使用Swift 3和ARC,我想手动保留一个对象。
我试过了object.retain()但是Xcode说它在ARC模式下不可用。还有另一种方法可以做到这一点,告诉Xcode我知道我在做什么吗?
长版:
我有一个LocationTracker类,它将自己注册为CLLocationManager的委托。当用户的位置发生更改时,它会更新名为location的静态变量。我的代码的其他部分需要位置访问此静态变量,而不需要或不需要对LocationTracker实例的引用。
此设计的问题是不保留委托,因此在CLLocationManager向其发送消息时会释放LocationTracker,从而导致崩溃。
在将其设置为委托之前,我想手动增加LocationTracker的引用计数。无论如何,对象永远不会被释放,因为只要应用程序正在运行,就应该监视该位置。
我找到了一个解决方法,即有一个静态变量'instance'来保持对LocationTracker的引用。我认为这个设计不够优雅,因为我永远不会使用'instance'变量。我可以摆脱它并明确增加引用计数吗?
正如声称的那样,这个问题并不重复,因为other question是关于Objective-C的,而这个问题是关于Swift的。
这可以通过withExtendedLifetime(_:_:)
函数轻松完成。从文档:
计算闭包,同时确保在闭包返回之前不会销毁给定的实例。
干杯!
解决方案结果是重新启用retain()和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
}
}
在ARC下,唯一的解决方案是在某处保留强大的参考。您当前的实施实际上是最佳解决方案。让您的位置跟踪器类保持自己的参考,以确保它坚持。
有多种方法可以实现你正在做的事情但是没有办法在ARC下调用retain
。