Swift - утечка памяти в JSONDecoder

Я обнаружил некоторые утечки памяти в моем приложении для 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 = try? decoder.decode (T.self, from: data) вызывает утечку, и я не знаю, как это предотвратить. Я покрыл весь блок кода с помощью попробуйте autoreleasepool {}, но это не решило мою проблему.

Я понимаю, что из этого фрагмента кода нелегко понять, что вызывает утечку, но когда я поискал в Google проблемы с утечкой памяти JSONDecoder (). Decode, я обнаружил слишком много жалоб от других разработчиков. Некоторые говорят, что это ошибка Swift, и я могу сказать, что Swift 5.0 не решил мою проблему. Я проверил свою версию Xcode Swift, и она 5.0.

Любые комментарии и / или совместное использование кода об общих функциях, которые декодируют ответ сервера, приветствуются. Спасибо.

введите описание изображения здесь


person thus    schedule 08.12.2020    source источник
comment
У меня сейчас точно такая же проблема - вы уже нашли решение?   -  person Norman    schedule 09.02.2021
comment
К сожалению, мне пока не удалось найти решение или обходной путь.   -  person thus    schedule 09.02.2021


Ответы (1)


Это особенность, а не утечка. Счетчик ссылок от инструментов:

введите описание изображения здесь

Функция _setInCache увеличила ref cnt на 1, а не в паре с сообщением о выпуске. Если предположить, что это вызвало утечку, обновление моих данных канала полностью увеличит объем памяти - снова выделение, снова утечка. Однако нет увеличения памяти или кэширования большей части данных.

person ERiSED    schedule 11.01.2021
comment
Это не совсем ответ на вопрос. Если у вас есть другой вопрос, вы можете задать его, нажав Задать вопрос. Вы также можете добавить вознаграждение, чтобы привлечь больше внимания к этому вопросу, когда у вас будет достаточно reputation. - Из отзыва - person shim; 11.01.2021