Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

254
Visualizações
JSONSerialization.jsonObject provoca pérdida de memoria en Swift 4.0 y 4.2

Estoy desarrollando una aplicación para iOS, usando Swift 4.0 (4.2 tiene el mismo problema).

Agregué una extensión a Encodable

 extension Encodable{ func toDict() throws -> [String:Any]? { let jsonEncoder = JSONEncoder() let jsonData = try jsonEncoder.encode(self) do{ return try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] } catch{ return nil } } }

Tengo una instancia de una clase Encodable que tiene propiedades que también son de una clase Encodable y noté que cuando llamo a instance.toDict() a menudo, la memoria que usa mi aplicación aumenta mucho. Esto es cierto incluso si no uso el resultado que se devuelve, también es cierto si devuelvo nil e ignoro el resultado de JSONSerialization.jsonObject .

Estoy seguro de que es esta línea la que está causando el problema (ignorar el resultado y devolver nil aún causa el problema y comentar esa línea y devolver nil detendrá el aumento de memoria.

La memoria aumenta cada vez más a medida que pasa el tiempo y se llama más a toDict() , eventualmente termino usando 400 MB en menos de 10 minutos.

¿Alguien ha encontrado este problema? y hay alguna solucion?

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Tal vez pueda ayudar. He estado trabajando en un proyecto que tiene un modelo de clase codificable. Pensé que todo funcionaba bien hasta que me di cuenta de que la aplicación fallaba debido a un problema de memoria (más de 1,2 GB) al intentar codificar en un bucle.

Después de depurar la aplicación, descubrí que el problema estaba en JSONEncoder y después de una búsqueda en Google descubrí que se trata de un error y que la solución que encontré que funcionaba mejor fue usar autoreleasepool. Mira aquí

en mi caso:

 static func store<T: Encodable>(_ object: T, to directory: Directory, as fileName: String) throws { do{ try autoreleasepool{ let url = getURL(for: directory).appendingPathComponent(fileName, isDirectory: false) let encoder = JSONEncoder() let data = try encoder.encode(object) if FileManager.default.fileExists(atPath: url.path) { try FileManager.default.removeItem(at: url) } FileManager.default.createFile(atPath: url.path, contents: data, attributes: nil) } } catch { throw(error) } }

Después de depurar nuevamente, veo que hay algunos picos pero la memoria se estabiliza.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda