2012-01-24 17 views
5

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.

+0

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

+0

A menos que necesite ejecutar en iOS 4.3. –

+0

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

Respuesta

4

he encontrado que esto parece ser un error en la implementación de IOS de zombis. Considere el siguiente código:

#import <Foundation/Foundation.h> 

@interface ClassB : NSObject 
@end 

@implementation ClassB 
- (id)init { 
    if ((self = [super init])) { 
    } 
    return self; 
} 
- (void)dealloc { 
    NSLog(@"ClassB dealloc"); 
} 
@end 

@interface ClassA : NSObject 
@property (nonatomic, strong) ClassB *b; 
@end 

@implementation ClassA 
@synthesize b; 
- (id)init { 
    if ((self = [super init])) { 
     b = [[ClassB alloc] init]; 
    } 
    return self; 
} 
- (void)dealloc { 
    NSLog(@"ClassA dealloc"); 
} 
@end 

int main() { 
    ClassA *a = [[ClassA alloc] init]; 
    return 0; 
} 

Esa es la Salida:

ClassA dealloc 
ClassB dealloc 

Pero con NSZombieEnabled conjunto de YES, se da salida:

ClassA dealloc 

Por lo que yo puedo decir, esta es una error. Parece que solo ocurre con iOS (simulador y dispositivo) y no ocurre cuando se compila y se ejecuta para Mac OS X. He archivado un radar con Apple.

Editar: Resulta que esto ya ha sido respondido aquí - Why is object not dealloc'ed when using ARC + NSZombieEnabled. Logré encontrarlo después de descubrir el verdadero problema. Por cierto, no tiene nada que ver con ARC.

+0

offtopic: no [super dealloc]; llamadas? – CarlJ

+1

@meccan - No, ya que estoy usando ARC. – mattjgalloway

Cuestiones relacionadas