如何使用ARC在Swift中手动保留



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

我尝试了object.retain(),但Xcode说它在ARC模式下不可用。有没有其他方法可以做到这一点,告诉Xcode我知道我在做什么?


长版本:

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

此设计的问题是没有保留委托,因此在CLLocationManager向LocationTracker发送消息时,LocationTrackers将被解除分配,从而导致崩溃。

在将LocationTracker设置为委托之前,我想手动增加它的refcount。无论如何,对象都不会被解除分配,因为只要应用程序在运行,就应该监视该位置。

我找到了一个解决方法,那就是使用一个静态变量"instance"来保持对LocationTracker的引用。我认为这种设计很不雅,因为我永远不会使用"instance"变量。我可以去掉它并显式地增加refcount吗?

正如所声称的那样,这个问题不是重复的,因为另一个问题是关于Objective-C的,而这个问题是关于Swift的。

解决方案是重新启用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
}
}

使用withExtendedLifetime(_:_:)函数很容易做到这一点。来自文件:

评估闭包,同时确保给定实例在闭包返回之前未被销毁。

干杯!

最新更新