gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 22:12:24 26 4
gpt4 key购买 nike

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

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


长版:

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

此设计的问题是委托(delegate)未保留,因此在 CLLocationManager 向其发送消息时 LocationTracker 被释放,从而导致崩溃。

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

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

正如所声称的那样,这个问题不是重复的,因为 other question是关于 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
}
}

关于swift - 如何使用 ARC 在 Swift 中手动保留?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41529052/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com