Mantener el ciclo en ARC

Nunca he trabajado en proyectos no basados ​​en ARC. Me encontré con un zombie en mi proyecto basado en ARC. Descubrí que era debido al ciclo de retención. Me pregunto qué es un ciclo de retención. Puede

¿Podría darme un ejemplo para retener el ciclo?

Un ciclo de retención es una situación en la que el objeto A conserva el objeto B , y el objeto B retiene el objeto A al mismo tiempo * . Aquí hay un ejemplo:

 @class Child; @interface Parent : NSObject { Child *child; // Instance variables are implicitly __strong } @end @interface Child : NSObject { Parent *parent; } @end 

Puede arreglar un ciclo de retención en ARC utilizando __weak variables weak o propiedades weak para sus “enlaces posteriores”, es decir, enlaces a padres directos o indirectos en una jerarquía de objetos:

 @class Child; @interface Parent : NSObject { Child *child; } @end @interface Child : NSObject { __weak Parent *parent; } @end 


* Esta es la forma más primitiva de un ciclo de retención; puede haber una larga cadena de objetos que se retengan en un círculo.

Esto es lo que es un ciclo de retención: cuando 2 objetos se mantienen una referencia el uno al otro y se retienen, crea un ciclo de retención ya que ambos objetos intentan retenerse entre sí, lo que hace imposible su liberación.

 @class classB; @interface classA @property (nonatomic, strong) classB *b; @end @class classA; @interface classB @property (nonatomic, strong) classA *a; @end 

Para evitar retener ciclos con ARC, simplemente declare uno de ellos con una referencia weak , así:

 @property (nonatomic, weak) classA *a; 

Esto es rápido, pero aquí hay una demostración interactiva de retención de ciclos en iOS: https://github.com/nickm01/RetainCycleLoggerExample