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

时间:2017-04-10 21:41:49

标签: swift memory-management dealloc

我正在尝试为网络调用创建重试机制。我创建了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?个问题,但被告知要打开一个新问题

1 个答案:

答案 0 :(得分:1)

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

Apple关于Automatic Reference Counting (ARC)的Swift手册很好地解答了您的问题。

通常你不需要有一系列的选项,

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

将很好地删除所有包含对象并删除对这些对象的引用。从上面提到的上下文中我不明白为什么需要声明一个可选项数组。如你所知,引擎盖下的Swift选项只是一个类型化的包装类Optional<Type>,它不会解决内存分配问题。

数组如何引用对象?

数组将增加包含的对象&#39;引用计数一,即强引用。

要确保要释放数组中的对象,必须使其引用计数等于零。如果没有其他东西引用包含的对象,那么从数组中删除它们就可以了。

请注意参考周期。在您的情况下,您不应该引用retries实例中的Retry数组。否则,即使将retries数组设置为nil,数组及其包含的对象仍然具有相互强引用,这意味着它们的引用计数永远不会减少到零,从而导致内存泄漏。