2010-11-12 19 views
6

Lo he probado y parece que sí. Entonces mi pregunta es SIEMPRE incrementa el conteo retenido.does addSubview increment retain count?

Así que cada vez que hacer algo como esto:

UIView *theView = [[[UIView alloc] initWithFrame:(CGRect)aFrame] autorelease]; 
[self.view addSubview:theView]; 

¿Estoy realmente perdiendo memoria?

que tienen una propiedad global @property (nonatomic, retain) UILabel *ingredientsTextLabel; la que crear una instancia en viewDidLoad con este código:

acabo la propiedad llamada, theres ninguna propiedad para que en mi cabecera, por lo que no get y set. En mi viewDidLoad:

ingredientsTextLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, ingredientsScrollView.frame.size.width, ingredientsScrollView.frame.size.height)]; 
    [ingredientsTextLabel setBackgroundColor:[UIColor clearColor]]; 
    [ingredientsTextLabel setFont:[UIFont fontWithName:@"Helvetica" size:18]]; 
    [ingredientsTextLabel setText:ingredientsText]; 
    [ingredientsTextLabel setNumberOfLines:0]; 
    [ingredientsTextLabel setLineBreakMode:UILineBreakModeWordWrap]; 
    NSLog(@"%i",[ingredientsTextLabel retainCount]); // here retain count is 1 

    CGSize maxSize = CGSizeMake(ingredientsScrollView.frame.size.width, 9999); 
    CGSize ingLabSize = [ingredientsText sizeWithFont:ingredientsTextLabel.font 
            constrainedToSize:maxSize 
             lineBreakMode:ingredientsTextLabel.lineBreakMode]; 

    [ingredientsTextLabel setFrame:CGRectMake(ingredientsTextLabel.frame.origin.x, ingredientsTextLabel.frame.origin.x, ingredientsTextLabel.frame.size.width, ingLabSize.height)]; 
    [ingredientsScrollView addSubview:ingredientsTextLabel]; 
    NSLog(@"%i",[ingredientsTextLabel retainCount]); // here retain count is 2! 

Ahora pensé que esto iba a funcionar y luego en dealloc que puede liberar ingredientsTextLabel, pero el recuento de retener es 2, por lo que necesito para liberar i también después de que addSubview así? ¡No me di cuenta de que esto sucede! :(

Respuesta

9

Sí, "addSubview" aumenta el conteo retenido. Esto tiene sentido porque el método almacena la subvista que no debe liberarse/liberarse hasta que también se publique la supervista. Cuando se publica la supervista, también libera todas sus subvistas .

+0

Correcto. Thomas, no necesitas hacer otra versión después de addSubview: solo debes preocuparte por liberar ONCE por alloc/init. Si addSubview: aumenta el conteo de retención, es su responsabilidad liberarlo. – pablasso

+0

oh cierto ... ya veo. Gracias. ¿Significa eso que si aloco/inicio un UIView, lo agrego como una subvista de 'self.view' y luego lo libero el conteo de retención sigue siendo 1? Por lo tanto, aunque lo publiqué, ¿puedo enviar mensajes? Gracias –

+0

Sí, eso es correcto. Pero si almacena una referencia a su UIView, también debe conservar esta UIView. Solo porque este es el estilo Cococa/Obj-C. – Felix

3

no utilice -retainCount.

el recuento absoluto retener de un objeto no tiene sentido.

debe llamar release exactamente el mismo número de veces que usted causó el objeto a ser retenido. no menos (a menos que te gusten las fugas) y, desde luego, no más (a menos que te gusten las caídas).

Véase el Memory Management Guidelines para más detalles.

Si + nueva/+ alloc/-retain/-copy (NARC) un objeto, es necesario equilibrar el retener con un lanzamiento (o autoerelease). Fin de la historia. La absoluta conservan recuento, sobre todo la absoluta conservan recuento de una instancia de una clase que es una subclase de una clase marco y/o pasado al código de la arquitectura, es un detalle de implementación y bastante probable que no sea lo que cree que debería ser.

2

En realidad lo hace. Puede referir esto al http://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/uiview/uiview.html#//apple_ref/occ/instm/UIView/addSubview:

Como cuestión de rutina, la supervista conserva la subvista en addSubview: así que se libera cuando se elimina la subvista.

+0

P.S. El colon al final del enlace es necesario. –

+0

+1 por responder la pregunta, pero usted escribió "En realidad sí". ¿Que hace? ¿Qué hace? ¡Estoy confundido! (Edite su respuesta usando el enlace "Editar" debajo del texto de su respuesta). – scraimer

+0

¡Guau, solo una respuesta más de un año y un poco más tarde que la pregunta fue hecha, y de hecho respondida! Scraimer Creo que Jason dice "Realmente lo hace" a la pregunta "¿el incremento addSubview conserva el recuento?". No es que nada de eso importe más con la llegada del recuento automático de referencias. : p –