gpt4 book ai didi

swift - 使用内部闭包时可能存在内存泄漏

转载 作者:行者123 更新时间:2023-11-30 10:31:44 24 4
gpt4 key购买 nike

我想确保以下内容没有内存泄漏。现在为了抛出一个错误 在我的代码中,在 ooder 中使用网络调用使其正常工作时,我必须保留对我的 dispatchgroupfunction 的引用来处理数据。

   func myFunc(
completion: @escaping (_ success: () throws -> Bool) -> Void) {

let fG = DispatchGroup()
let processLinks = self.processDownloadData
requestDownloadLinks(fromURL: url) { result in
switch result {
case .success(let data):
processLinks(data, fG, stagingBundle, {_ in
switch result {
case .failure(let error):
completion({ throw error })
case .success:
completion({ return true })
}
})
case .failure(let error):
completion({ return true })
}
}

其中processDownloadData

    func processDownloadData(
data: ((urls: [(url: URL, language: String)], version: String)),
dispatchGroup: DispatchGroup),
completion: @escaping (_ success: () throws -> Bool) -> Void) {
//write data
}

requestDownloadLinks

  final func requestDownloadLinks(
fromURL url: URL,
completion: ((Result<(urls: [(url: URL, language: String)],
version: String), Error>) -> Void)? = nil
) {
DispatchQueue.global(qos: .background).async { [weak self] in
guard let self = self else {return}
self.httpManager?.get(url: url) {result in
switch result {
case .failure(let error):
if let completion = completion {
completion(.failure(LokalisationError.network(originatingError: error)))
}
case .success(let data):
do {
guard let data = data as? Data else {
if let completion = completion {
completion(.failure(LokalisationError.malformedDataFromServer))
}
return
}
let decoder = JSONDecoder()
let contents = try decoder.decode(EndPointResponse.self, from: data)
if let data = contents.data {
let urls = data.map { URL(string: $0.url) ?? URL(fileURLWithPath: "") }
let language = data.map { $0.language }
let urlsForLang = Array(zip(urls, language))
if let completion = completion {
completion(.success( (urlsForLang, contents.version) ))
}
}
} catch let error {
if let completion = completion {
completion(.failure(LokalisationError.network(originatingError: error)))
}

}
}
}
}
}

现在这样做是否会造成内存泄漏?当我创建对dispatchgroup和函数的引用时,我认为它们在http调用完成之前不会被释放。现在没关系,因为它要么成功完成,要么出错。或者这会导致内存泄漏吗?

最佳答案

您的 DispatchGroup 将一直存在,直到 requestDownloadLinks 中的 completion() 完成,除非您在 processDownloadData 中使用它做了一些有趣的事情。您通过闭包 block 将其作为引用从 myFunc() 传递到 requestDownloadLinks,在闭包 block 内调用将 DispatchGroup 传递给的 processDownloadData它。如果它没有被传递或作为引用保存在其中,那么您可能是安全的。确保使用 Instruments 分析您的应用程序并检查内存分配和僵尸。您还可以在调试器中检查内存占用情况。如果多次调用 myfunc,您应该会看到内存稳步增加。

关于swift - 使用内部闭包时可能存在内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59045619/

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