ios memory-leaks nsurlsession http2 nsurlsessiondatatask

ios - NSURLSession HTTP/2 pérdida de memoria



memory-leaks http2 (1)

De apple doc:

El objeto de la sesión guarda una fuerte referencia al delegado hasta que su aplicación finalice o invalide explícitamente la sesión. Si no invalida la sesión, su aplicación pierde memoria hasta que se cierra.

También mirando su proyecto https://github.com/upyun/swift-sdk/tree/testleak necesita llamar a finishTasksAndInvalidate () después de sessionTask.resume () ya que está creando sesión por solicitud

En estos casos de Mi prueba, señalar que al usar NSURLSession con una conexión HTTP / 2 hay un problema de memoria.

test1: iOS 9. HTTP / 2 servidor

Uso NSURLSession para cargar un archivo de 10M en un servidor HTTP / 2, si el archivo cargado completó todo está bien, pero si cancelo la tarea de carga antes de que se complete, el 10M nunca se lanzará.

test2: iOS 9. Servidor HTTPs1.1

Pruebo el mismo código con un servidor de archivos https1.1, cancelo la tarea de carga o no, todo está bien, la memoria vuelve a la normalidad (se lanzan datos de 10M)

test3 iOS 8. HTTP / 2 servidor

En este caso todo está bien. (NSURLSession no negoció el protocolo con HTTP / 2)

Entonces, incluso hay algo que no es apropiado con mi uso de NSURLSession, el rendimiento de NSURLSession no es normal con HTTP / 2.

Además del problema de memoria, al usar NSURLSession con HTTP / 2 para cargar archivos, el tamaño del segmento de progreso es enorme (2M de mayo ''didSendBodyData'' en una sola llamada)

También había leído esta página . SSL puede almacenar en caché algo, pero no debe almacenar en caché todo el archivo. (Cuando cancelo la tarea o solicito el tiempo de espera agotado, se pierde la memoria del tamaño de 10M)

Alguien sabe qué causa el problema, podría darme algo de ayuda. Gracias.

Actualización de pregunta 0912: agregue un enlace de proyecto de prueba

Proyecto de prueba: https://github.com/upyun/swift-sdk/tree/testleak

file:UPUtils.swift //Change the url to make comparison test. //let DEFAULT_UPYUN_FORM_API_DOMAIN = "http://v0.api.upyun.com"//http1.1 //let DEFAULT_UPYUN_FORM_API_DOMAIN = "https://httpbin.org/post" //https1.1 let DEFAULT_UPYUN_FORM_API_DOMAIN = "https://v0.api.upyun.com"//http2