Problema de detección de fugas en iOS con xCode 4.3

Tengo un problema muy extraño con los instrumentos de pérdida de memory xCode 4.3 … Básicamente no funciona en el siguiente caso …

  1. El proyecto se crea sin el soporte de ARC.
  2. Cree una class simple que henetworkinge UIView
  3. use un "button" para crear una instancia de esta class y "fuguela" … la fuga no será capturada por los instrumentos de fugas

así que aquí está el código de la class PROBLEMATIC

@interface LeakTestView : UIView - (id)initWithFrame:(CGRect)frame; @end @implementation LeakTestView - (id)initWithFrame:(CGRect)frame { NSLog(@"initWithFrame called"); self = [super initWithFrame:frame]; if (self) { // Initialization code } return self; } @end 

Y ahora creo la filtración …

 - (IBAction)leak:(id)sender { LeakTestView* leak=[[LeakTestView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)]; NSLog(@"class is %@", [leak class]); } 

Entonces, el problema es que esta fuga no se detectará …

Si cambio la class base a NSObject y, en lugar de initWithFrame, anulo init (ver más abajo), entonces se detectará la fuga …

así que aquí está el código de fuga que se detectará

 @interface LeakTestView : NSObject - (id) init; @end @implementation LeakTestView - (id) init { NSLog(@"init called"); self = [super init]; if (self) { } return self; } @end 

Si creo un object ahora y lo abandono, la detección de fugas se activará y la fuga será "vista" en los Instrumentos.

 - (IBAction)leak:(id)sender { LeakTestView* leak=[[LeakTestView alloc]init]; NSLog(@"class is %@", [leak class]); } 

Alguna idea de lo que está pasando? ¿Por qué la fuga de la subclass UIView no se detectará, pero cambiar la class base a NSObject "solucionará" el problema? Ah, sí, el object filtrado se puede ver usando el "Mark heap": una marca antes de la fuga y una marca después de hacer clic en el button y crear la fuga; la class se verá en el delta del montón …

EDITAR: una situación más "divertida" … Si elimino las cosas "init" (solo asigno el object)

 LeakTestView* leak=[LeakTestView alloc]; 

entonces la fuga será detectada sin importar cuál sea la class base … ¿Qué diablos está pasando aquí?

EDIT2: una cosa más "graciosa". El problema de detección de Fugas se puede observar solo en Simulator (iOS 5.0, 9A334 es mío), pero la fuga será detectada siempre que se use el dispositivo iPad …

¿Algún comentario? Si no tiene el problema o considera que hablo "mentiras", solo dígame que estoy equivocado y que el caso anterior está funcionando "bien" – ¡las fugas que describo son detectadas por sus instrumentos xCode!

¿Tal vez no está goteando?

Estás llamando a un método que es un recuadro negro. Cómo se implementa UIView initWithFrame no es de su incumbencia. Tiene un tipo de contrato, pero no tiene derecho a exigir que esto se escape más de lo que puede suponer que el conteo de retención es 1.

Leaks es una herramienta útil pero no hace lo que cree que hace. No te dice cuándo has ennetworkingado. Te dice cuándo tienes asignaciones inalcanzables. Esto no es lo mismo.

O puede ser un error.