objective c - Mantener el ciclo en ARC
objective-c xcode (3)
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?
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;
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 rápido, pero aquí hay una demostración interactiva de retención de ciclos en iOS: https://github.com/nickm01/RetainCycleLoggerExample