我正在尝试为网络调用创建重试机制。我创建了2个类。一个是重试类,另一个是经理,如果我想要,我可以取消所有课程。
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?个问题,但被告知要打开一个新问题
答案 0 :(得分:1)
不确定我是否可以回答你的问题,但我会尽力了解:)。
Apple关于Automatic Reference Counting (ARC)的Swift手册很好地解答了您的问题。
通常你不需要有一系列的选项,
var retries = [Retry]()
...
retries.removeAll()
将很好地删除所有包含对象并删除对这些对象的引用。从上面提到的上下文中我不明白为什么需要声明一个可选项数组。如你所知,引擎盖下的Swift选项只是一个类型化的包装类Optional<Type>
,它不会解决内存分配问题。
数组将增加包含的对象&#39;引用计数一,即强引用。
要确保要释放数组中的对象,必须使其引用计数等于零。如果没有其他东西引用包含的对象,那么从数组中删除它们就可以了。
请注意参考周期。在您的情况下,您不应该引用retries
实例中的Retry
数组。否则,即使将retries
数组设置为nil
,数组及其包含的对象仍然具有相互强引用,这意味着它们的引用计数永远不会减少到零,从而导致内存泄漏。