6

Tengo un problema muy extraño con los instrumentos de fugas Xcode 4.3 memoria ... Básicamente no funciona en los siguientes casos ...en IOS con xCode 4.3

  1. proyecto se crea sin ARC apoyo.
  2. crear una clase simple que hereda UIView
  3. utilizar un "botón" para crear instancia de esta clase y "fugas" que ... la fuga no será captura por los instrumentos de fugas

asi que aquí hay el código de la clase PROBLEMÁTICO

@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 que la fuga ...

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

Así que el problema es que no se detectará esta fuga ...

Si cambio de la clase base a NSObject y en lugar de initWithFrame init anulación (ver abajo) y luego se detectó la fuga ....

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

@interface LeakTestView : NSObject 
- (id) init; 
@end 


@implementation LeakTestView 

- (id) init { 
    NSLog(@"init called"); 
    self = [super init]; 
    if (self) { 

    } 
    return self; 
} 
@end 

Si creo objeto ahora y lo dejo - la detección de fugas se disparará y la fuga será "visto" en los instrumentos.

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

¿Alguna idea de qué está pasando? ¿Por qué no se detectará la pérdida de la subclase UIView, pero cambiar la clase base a NSObject "solucionará" el problema? Ah, sí, el objeto filtrado se puede ver con el "Mark Heap": una marca antes de la fuga y una marca después de hacer clic en el botón y crear la fuga: la clase se verá en el montón delta ...

EDIT: una situación más "divertida" ... Si quito las cosas "init" (sólo el objeto alloc)

LeakTestView* leak=[LeakTestView alloc]; 

continuación, la fuga será detectada no importa qué es la clase base ... lo diablos está pasando aquí?

EDIT2: una cosa más "divertida". El problema de detección de fugas solo se puede observar en Simulator (iOS 5.0, 9A334 es mío) pero la fuga se detectará siempre si se utiliza el dispositivo iPad ...

¿Algún comentario? Si no tienes el problema o consideras que pronuncio "mentiras" solo dime que estoy equivocado y que el caso anterior está funcionando "bien" - las fugas que describo son detectadas por tus instrumentos xCode.

+0

¿Qué "instrumentos"? ¿Qué detector (es) de fugas estás usando? –

Respuesta

0

¿Quizás no tenga fugas?

Está llamando a un método que es una caja negra. Cómo se implementa UIView initWithFrame no es de su incumbencia. Tiene un contrato de algún tipo, pero no tiene derecho a exigir que se filtre más de lo que puede suponer que el recuento de retenciones es 1.

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

O, podría ser un error.

+0

Gracias por la respuesta. Sé que Leaks detecta asignaciones inalcanzables (y esta herramienta no es una solución "mágica" para mostrar dónde están los problemas en el código), pero si verifico el conteo retenido del objeto "filtrado" dice 1 (como debería) entonces el único retener que está "activo" es de la alloc. Entonces para mí hay una filtración que los instrumentos no pueden "encontrar", incluso si es "tan simple". Es realmente fácil crear un proyecto de muestra para probarlo usted mismo, simplemente use el simulador y filtre una subclase de UIView, y verifique si los instrumentos lo encuentran ... – Sunman

+0

Lo sé, estoy totalmente de acuerdo en que es extraño, pero el retener el conteo realmente, realmente no te está diciendo nada. Ignorarlo> http://www.friday.com/bbum/2011/12/18/retaincount-is-useless/ – hooleyhoop

+0

Sé que el conteo retenido no se puede usar para decir "cuántos objetos externos se refieren a mí" debido a la la implementación @property y otros factores, pero en algunos casos da información sobre lo que está sucediendo, y en el caso anterior garantiza que la única referencia al objeto recién creado es de la asignación y initWithFrame no incrementa el recuento de retenciones y en de esta manera evitando que el instrumento de fugas encuentre la fuga ... – Sunman

Cuestiones relacionadas