Pregunta

He estado leyendo sobre autoreleasepool pero hay un punto que es un poco claro para mí. Tengo algunas funciones utilizando hilos que requerían Gestión de memoria separada usando autoreleasepool.

En el siguiente ejemplo es correcta

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];

   NSString *myString = @"Hello";

   [pool release];
}

¿Es esto correcto?

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];

   NSString *myString = [[NSString alloc] initWithString:@"Hello"];

   [pool release];
}

o esto?

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];

   NSString *myString = [[NSString alloc] initWithString:@"Hello"];

   [myString release];
   [pool release];
}

Mi pregunta es propiedad objetos creados en el ámbito de la necesidad de la piscina autorelease ser relased específica o son el cuidado de cuando se ha liberado el autorelasepool?

Teo

¿Fue útil?

Solución

manijas piscina Autorelease los objetos autoreleased. Si el propietario de un objeto (a través de alloc o copiar o retener), entonces debe liberarlo. Por lo que su segundo ejemplo no es correcta. Como se ha asignado la cadena, es el propietario y debe liberarlo.

Una piscina autorelease se crea para el hilo principal. (Usted puede mirar en el principal función si lo desea). Cada hilo necesita su propia piscina autorelease para administrar objetos autoreleased. Es por eso que si se crea otro hilo, entonces debe crear un grupo de disparador automático para ese hilo. Incluso si usted no crea objetos autoreleased en el hilo, se debe crear esto como las llamadas a las bibliotecas en ese hilo puede crear objetos autoreleased. Incluso si está seguro de que no hay llamadas a las bibliotecas están haciendo objetos autoreleased entonces también debe crear como que es la mejor práctica, especialmente si se está trabajando en el gran proyecto que es desarrollado y mantenido por varias personas.

Otros consejos

Sólo tiene que crear su propia piscina autorelease cuando se está creando un montón de autoreleased objetos que desea recoger la basura inmediatamente. Sin embargo, estás en lo correcto en que no quiere hacer referencia a cualquier "autoreleased" objetos creados después de soltar la piscina. autoreleased objetos (que no conserve) se destruyen cuando se drena la piscina.

Dado que ninguno de los objetos en su ejemplo se autoreleased, la creación de su propia piscina autorelease es esencialmente un op-no.

Ninguno de los ejemplos necesita una piscina autorelease. piscinas Autorelease solamente se ocupan de objetos autoreleased:

NSArray *foo = [NSArray array];
NSObject *bar = [[[NSObject alloc] init] autorelease];

Su primera cadena se inicializa utilizando un literal de cadena y por lo tanto es probable especial con respecto a la gestión de memoria (tal vez alguien más sabe más). Sus segundas fugas de cuerdas, la piscina no hace una diferencia. Su tercera cuerda se libera correctamente, de nuevo a la piscina no hace una diferencia.

Aquí es donde se necesitaría una piscina:

- (void) someMethodThatRunsOnAThread {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSString *foo = [@"foo" uppercaseString];
    [pool drain];
}

A continuación, la cadena foo sería la fuga si la piscina no estaba allí. Tenga en cuenta que estoy llamando drain en lugar de release en la piscina -. En IOS no hay una diferencia, pero en entornos de basura recogidas por los dos difieren, por lo que es probable que sea mejor para conseguir en el hábito de llamar la correcta

También tenga en cuenta que es posible que tenga una piscina, aunque no AutoRelease ningún objeto a sí mismo, podría haber muchas operaciones de memoria en algún hecho en el código que está llamando en su método.

Piense que esto debería ser algo como esto:

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];


   NSString *myString = [[[NSString alloc] initWithString:@"Hello"] autorelease];

   // or create string like this (automatically autoreleased)
   NSString *myString = [NSString stringWithString:@"Hello"];

   [pool release];
}

Debe enviar el mensaje autorelease, a objetos en el interior de la piscina autorelease. Ellos serán liberados cuando mensaje de liberación se envía a la piscina.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top