它会在快速的类方法中导致内存泄漏吗

Posted

技术标签:

【中文标题】它会在快速的类方法中导致内存泄漏吗【英文标题】:Will it cause memory leak with in a swift class method 【发布时间】:2017-11-11 00:41:47 【问题描述】:

我的问题是我不确定类方法中的闭包是否会导致内存泄漏。 这是我的代码

class func SomeDownloadFun (pdfDirectory:String)    

      let destination : DownloadRequest.DownloadFileDestination = 
            _, response in

//----------HERE I Reference the item 'pdfDirectory'-----Will this cause leak?
            let fileURL = URL(fileURLWithPath: pdfDirectory)

            return (fileURL,[.removePreviousFile,.createIntermediateDirectories])
        


        let downLoadRequest = Alamofire.download(urlStr!, to: destination)

 downLoadRequest.responseData(completionHandler:  (response) in

                switch response.result 
                case .success:

//----------HERE I Reference the item 'pdfDirectory'-----Will this cause leak?

                    print("pdfDirectory")


                    break

                case .failure:
                    print("down err")
                    break

                

            )

Aa 我已经评论了我认为它会导致泄漏的地方,谁能告诉我,谢谢!????

【问题讨论】:

嗯,谢谢,但是如果将我的 pdfDirectory 定义为 NSDictionary 或其他内容,会导致引用循环吗? 【参考方案1】:

几个观察:

    仅仅因为你在闭包中引用了一个对象并不意味着你有一个强引用循环。您需要循环引用(例如,A 对 B 有强引用,B 对 A 有自己的强引用),以便拥有强引用循环,这在此处不会发生。

    pdfDirectory 甚至不是一个引用类型(String 是一个struct,一个值类型),所以无论如何都不可能有一个强引用循环。它只会发生在引用类型上(例如 class 而不是 struct)。

即使您在对话中引入了NSDictionary(一种引用类型),仅凭这一点还不足以形成强大的引用循环。不要基于某些引用类型的闭包的存在而对强引用循环下结论。找出(或使用"Debug memory graph" 或 Instruments)给定对象对哪些对象具有强引用,并确定此时是否存在强引用循环。

【讨论】:

以上是关于它会在快速的类方法中导致内存泄漏吗的主要内容,如果未能解决你的问题,请参考以下文章

绑定会在 WPF 中造成内存泄漏吗?

JavaScript setInterval() 方法会导致内存泄漏吗?

这很可能会在 Tomcat 中造成内存泄漏吗?

转《js闭包与内存泄漏》

仪器中存在内存泄漏的类

预定的未来会导致内存泄漏吗?