Я обнаружил некоторые утечки памяти в моем приложении для 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.
Любые комментарии и / или совместное использование кода об общих функциях, которые декодируют ответ сервера, приветствуются. Спасибо.