Duplicar posible:
Why is object not dealloc'ed when using ARC + NSZombieEnablededición extraña ARC no liberar Ivar en UIView subclase
Tengo un problema muy extraño que estoy viendo en este momento en un proyecto. En pocas palabras, tengo ViewA
que posee ViewB
(propiedad strong
). ViewA
crea su ViewB
en su inicializador. Ambos objetos son subclases de UIView
.
He anulado dealloc
en ambos y poner una línea de registro y un punto de quiebre para ver si son golpeados. Parece que ViewA
's dealloc
está siendo golpeado pero no ViewB
' s. Sin embargo si pongo en un self.viewB = nil
en el dealloc
de ViewA
entonces es éxito.
Así que básicamente es algo como esto:
@interface ViewA : UIView
@property (nonatomic, strong) ViewB *viewB;
@end
@implementation ViewA
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
self.viewB = [[ViewB alloc] initWithFrame:self.bounds];
[self addSubview:self.viewB];
}
return self;
}
- (void)dealloc {
//self.viewB = nil; ///< Toggling this commented/uncommented changes if ViewB's dealloc gets called.
NSLog(@"ViewA dealloc");
}
@end
Lo que no puedo entender es por qué nil-ing viewB
a cabo hace una diferencia. Si algo más se mantiene en viewB
entonces no debería haber absolutamente ninguna diferencia si no lo hago aquí o no. Y no debería hacer una diferencia en la cantidad de lanzamientos que agrega ARC.
Me parece que no puede reproducirlo en un caso de prueba mínima hasta ahora, pero estoy trabajando en él. Y no puedo publicar el código real en el que estoy viendo esto desafortunadamente. Sin embargo, no veo que eso sea un problema porque es más bien el punto de que anularlo no debería marcar una diferencia con la que estoy confundido.
Puede alguien ver algo que se me escapa o dar consejos sobre dónde buscar para depurar este problema?
Actualización:
que he encontrado el problema. Parece que solo es un problema cuando NSZombieEnabled
se establece en YES
. Bueno, eso es completamente loco y tiene que ser un error seguramente. Los zombis no deberían afectar la forma en que esto funciona, hasta donde yo sé. Los objetos aún deben pasar por el método dealloc
. Y lo que es más, es simplemente loca que funciona si fuera nula viewB
en ViewA
's dealloc
.
Como fuera de tema, puede hacerlo 'weak' y olvidarse del problema:' [self addSubview: self.viewB] 'conserva' viewB' para usted, por lo que no se lanzará prematuramente, incluso si mantener una referencia 'débil' al mismo. – dasblinkenlight
A menos que necesite ejecutar en iOS 4.3. –
Precisamente. Quiero que se ejecute en iOS 4.x y también, ** no debería tener que hacer eso **. No veo por qué anular 'viewB' en' dealloc' está marcando la diferencia. Eso solo me parece enojado. – mattjgalloway