gpt4 book ai didi

Swift - JSONDecoder 中的内存泄漏

转载 作者:行者123 更新时间:2023-12-05 06:56:01 24 4
gpt4 key购买 nike

我的 iOS 应用程序在解码服务器响应时发现了一些内存泄漏。这些内存泄漏不会一直发生。我正在使用以下代码来解码响应。这些代码位于通用结构中。 T.self 也是一个结构而不是一个类。

struct Response<T:Decodable> {

var value: T?
var result: ProcessResult<CustomError>
var request: TRequestHeader

init(_ request: TRequestHeader) {
self.request = request
result = .noDataReceived
}

init(_ request: TRequestHeader, _ responseData: Data) {
self.init(request)
do {
try autoreleasepool {
// parse the server response
if let dict = try JSONSerialization.jsonObject(with: responseData) as? [String:Any] {
var success = dict["success"] as? Bool ?? false
var dataDict: [String:Any]?
var dataArray: [Any]?

dataDict = dict["data"] as? [String:Any]
if dataDict == nil {
dataArray = dict["data"] as? [Any]
}

// now we can decode the JSON data
if success {
if let dict = dataDict {
if let data = try? JSONSerialization.data(withJSONObject: dict, options: []) {
let decoder = JSONDecoder()
if let decodedObj = try? decoder.decode(T.self, from: data) {
value = decodedObj
}
}
} else if let array = dataArray {
if let data = try? JSONSerialization.data(withJSONObject: array, options: []) {
let decoder = JSONDecoder()
if let decodedObj = try? decoder.decode(T.self, from: data) {
value = decodedObj
}
}
}

result = .success
}
}
}
} catch let error {
result = .failed(CustomError(code: 0, message: error.localizedDescription))
}
}
}

那么 if let decodedObj = 试试? decoder.decode(T.self, from: data) 导致泄漏,我不知道如何防止这种情况。我用 try autoreleasepool{ } 覆盖了整个代码块,但它没有解决我的问题。

我知道要理解导致此代码片段泄漏的原因并不容易,但是当我用谷歌搜索 JSONDecoder().decode 内存泄漏问题时,我发现其他开发人员提示太多。有人说这是 Swift 中的一个错误,我可以说 Swift 5.0 没有解决我的问题。我已经检查了我的 Xcode 的 Swift 版本,它是 5.0。

非常感谢任何关于解码服务器响应的通用函数的评论和/或代码共享。谢谢。

enter image description here

最佳答案

这是一个功能,而不是泄漏。来自 Instruments 的引用计数:

enter image description here

函数 _setInCache 将 ref cnt 增加 1,未与释放消息配对。假设它导致泄漏,刷新我的提要数据绝对会增加内存占用——再次分配,再次泄漏。但是没有内存增量,或者缓存了大部分数据。

关于Swift - JSONDecoder 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65197417/

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