gpt4 book ai didi

swift - 如何从数组中释放所有引用元素?

转载 作者:行者123 更新时间:2023-11-28 15:44:23 25 4
gpt4 key购买 nike

我正在尝试为我们的网络调用创建一个重试机制。我创建了 2 个类。一个是重试类(class),另一个是经理,以防万一我可以取消所有类(class)。

class Retry {
var url: String
var maxRetries: Int

init (url: String, retryCount: Int){
self.url = url
self.maxRetries = maxRetries
poll()
RetryManager.shared.add(self)
}

private func poll(){
guard retryCount == 0 else{
print("error")
}
getRequest()
}

private func getRequest(){
// make network request
// if no response is received poll again
}


func cancel(){
maxRetries = 0
}
}

经理类

class RetryManager{

static let sharedInstance = RetryManager()
var retries : [Retry?] = []

private init(){
}

func register(retry: Retry){
retries.append(retry)
}
func remove(retry: Retry){
retry.cancel() // XX; Do I also need this or just removing it is fine?
retries = retries.filter({$0 !== retry})
}

func cancelAll(){

retries.forEach({$0?.cancel()}) // ZZ; Do I also need this? or just removing them is fine?
retries.removeAll()

}

}

我的重试实例将用于进行网络调用。

我的主要问题是关于我的取消 机制。执行 RetryManager.shared.cancelAll() 是否足以解除分配?或者我需要运行取消或每个取消 实例(即 XX、ZZ​​ 也是必需的)?

目前一切正常,但我不确定如果我有多个指针,它是否会工作......我需要做:

for index..<retries.count{
retries[index] = nil
}

据我所知,这无济于事,这与执行 retries.removeAll()

相同

我也看了 In Swift, how do I set every element inside an array to nil?问题,但被告知打开一个新问题

最佳答案

不确定我是否可以回答你的问题,但我会尽我所能:)。

Apple 的 Swift 手册 Automatic Reference Counting (ARC)很好地涵盖了您的问题。

通常你不需要有一个可选数组,

var retries = [Retry]() 
...
retries.removeAll()

将很好地删除所有包含的对象并删除对这些对象的引用。从您上面介绍的上下文来看,我不明白为什么您需要声明一个可选数组。如你所知,Swift 的可选值在底层只是一个类型化的包装类 Optional<Type> ,这不能解决内存分配问题。

数组如何引用对象?

数组会将包含的对象的引用计数加一,即强引用。

要确保数组中的对象被释放,必须使它们的引用计数为零。如果没有其他对象引用包含的对象,则将它们从数组中移除即可。

不过要注意引用循环。在您的情况下,您不应引用 retries Retry 中的数组实例。否则即使你设置了retries数组到 nil ,数组和它包含的对象之间仍然有强引用,这意味着它们的引用计数永远不会减少到零,从而导致内存泄漏。

关于swift - 如何从数组中释放所有引用元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43333328/

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