【问题标题】:Swift - Memory Leak in JSONDecoderSwift - JSONDecoder 中的内存泄漏
【发布时间】:2021-03-19 16:27:15
【问题描述】:

我的 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))
        }
    }
}

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

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

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

【问题讨论】:

  • 我目前遇到了完全相同的问题 - 您找到解决方案了吗?
  • 很遗憾,我还没有找到解决方案或解决方法。

标签: swift memory-leaks jsondecoder


【解决方案1】:

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

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

【讨论】:

  • 这并不能真正回答问题。如果您有其他问题,可以点击 提问。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review
猜你喜欢
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
  • 2017-06-22
  • 1970-01-01
  • 2016-03-28
  • 2020-04-29
  • 1970-01-01
相关资源
最近更新 更多