Referencia circular de arco en Objective-C usa delegado
-
26-10-2019 - |
Pregunta
¡Hola!
Traté de usar un delegado en mi aplicación. Mi proyecto usa ARCO
Por ejemplo, tengo el protocolo x y dos objetos que lo usan. En objeto B Creé una instancia para el objeto A y establecer delegado self (a.delegate = self) en tiempo de ejecución invoco una devolución de llamada de método (en este punto mi objeto delegado es B). Después de eso, todos ejecutan el -Mostrar resultado método.
¿En qué punto se forma una referencia circular? Entiendo que este es un problema con el especificador fuerte, pero no entiendo a qué hora sucedió y cómo rastrearlo.
¡Gracias!
Solución
Si dos objetos mantienen fuertes referencias entre sí (es decir, se conservan entre sí), pueden tener lo que se conoce como un "ciclo de retención" en sus manos. Ninguno de los objetos se desanimará porque el otro tiene una fuerte referencia a él (lo retiene), por lo que nunca renunciará a su referencia (liberación) del otro objeto.
Esta situación es común con los delegados, donde un objeto (llamarlo A) crea otro (b) y se establece como delegado de B. Si A tiene una sólida referencia a B para que B no se trate, y B también tiene una fuerte referencia a A, tiene un ciclo de referencia. Para evitar eso, es común que los objetos no retengan o mantengan referencias fuertes a sus delegados. Haga la referencia de B a un débil en lugar de fuerte y el problema desaparece.
Otros consejos
Parece que mantiene una fuerte referencia a A en B., ya sea que sea una referencia débil o, que es la práctica común, hace que el delegado sea una referencia débil. En el último caso, debe asegurarse de establecer A delegate
a nil
Antes de que B se trate.