Estoy aprendiendo sobre débil vs fuerte y todavía no lo entiendo completamente. ¿Cómo puedo declarar una respuesta débil en la siguiente función para no tener un ciclo retenido?
AF.request(url, method: .get).validate().responseData { [weak self] response in guard let data = response.data else { completionHandler(.failure(.apiFailed)) return } do { let decodedData = try JSONDecoder().decode(T.self, from: data) DispatchQueue.main.async { completionHandler(.success(decodedData)) } } catch { completionHandler(.failure(.corruptedData)) return } }En este momento tengo una advertencia de xcode que dice:
Variable 'self' was written to, but never read
¿Cómo puedo leerlo usando débil?
Un ciclo de retención solo puede ocurrir cuando un objeto termina siendo dueño de sí mismo a través de una serie de relaciones strong , generalmente a través de uno o más objetos en una cadena. Por ejemplo, si un objeto A tiene una relación de propiedad con un objeto B y el objeto B tiene una relación de propiedad con el objeto A , entonces A termina con una relación de propiedad consigo mismo, lo que puede evitar que se desasigne. Romper este ciclo requiere que uno de estos objetos cambie su propiedad a una relación sin propiedad ( weak o unowned propiedad). (Esto también puede suceder si A almacena una referencia strong directamente a sí mismo, o si la cadena va A -> B -> C -> D -> A , o cualquier otra configuración).
En el contexto de devoluciones de llamada como esta, el riesgo que corre con los ciclos de retención es que si el objeto A almacena un cierre que tiene una referencia strong (el valor predeterminado implícito) a A en algún lugar dentro de él, se refiere cíclicamente a sí mismo.
Sin embargo: esto solo sucede si el cierre realmente tiene una razón para mantener una strong referencia a A en primer lugar. Su cierre, por ejemplo, nunca se refiere a self dentro de él, por lo que no tendría ninguna razón para mantener una referencia a self , strong o no. Los cierres solo mantienen referencias (o "cerrar", por lo tanto, "cierre") a las cosas que se usan dentro de ellos, y self no lo es.
De ahí la advertencia: nunca está "leyendo" (es decir, accediendo) a self en ningún lugar dentro del cierre, por lo que el [weak self] es completamente innecesario.