2010-01-16 14 views
11

Todavía tengo un poco claro acerca de la liberación y liberación automática. ¿Cuál es la diferencia entre ambos? Tengo este código. Para la conexión de Facebook. A veces me cuelgo cuando ingreso al Facebook, dudo que tal vez sea porque no lanzo el objeto muy bien. Gracias por cualquier ayuda¿Cuál es la diferencia entre liberar y autorrellenar?

if (_session.isConnected) { 
     [_session logout]; 
    } else { 
     FBLoginDialog* dialog = [[[FBLoginDialog alloc] initWithSession:_session] autorelease]; 
     [dialog show]; 
    } 

Respuesta

20

El Memory Management Programming Guide for Cocoa pronto será su mejor amigo. En resumen, las instancias de objeto en Cocoa se administran mediante conteo de referencias (a menos que, por supuesto, esté utilizando la recolección de elementos no utilizados en OS X). Un objeto indica que desea "retener" un interés de propiedad en otra instancia, evitar que se desasigne, enviándole un mensaje de -retain. Un objeto indica que desea liberar ese interés enviando a la otra instancia un mensaje -release. Si el número de objetos que se han "retenido" y el interés de propiedad en un objeto cae a 0 (es decir, cuando la última de las instancias propietarias envía un mensaje -release), la instancia con un recuento de retención 0 se desasigna.

A veces es conveniente decir "Quiero que se publique esta instancia en algún momento en el futuro". Ese es el propósito de -autorelease. El envío de un mensaje -autorelease agrega el receptor al actual NSAutoreleasePool. Cuando se agota ese grupo, envía un mensaje -release a todas las instancias en el conjunto. Se crea automáticamente NSAutoreleasePool al comienzo de cada iteración del ciclo de ejecución de cada subproceso y se drena al final de esa iteración. Por lo tanto, se puede hacer algo como esto en un método:

- (id)myMethod { 
    return [[[MyObject alloc] init] autorelease]; 
} 

El que llama a este método se pondrá en contacto una instancia que puedan -retain si desean mantenerlo. Si no lo retienen, que se quedará al menos hasta que se vacía la piscina autorelease adjuntando:

- (void)someOtherMethod { 
... 

id instance = [obj myMethod]; 
... // do more with instance, knowing that it won't be dealloc'd until after someOtherMethod returns 

} 
+0

el enlace a la guía de programación de gestión de memoria parece estar roto; la versión de iOS se puede encontrar ahora en https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html – CCJ

3

De acuerdo con la Memory Management Programming Guide for Cocoa:

El método autorelease, definido por NSObject, marca el receptor para más tarde liberación. Al liberar automáticamente un objeto , es decir, al enviarle un mensaje de liberación automática , declara que no desea tener el objeto más allá del alcance en el que envió autorelease.

También:

Así, el método autorelease permite cada objeto de usar otros objetos sin preocuparse de la eliminación de ellos.

4

fondo discusión:

Objective-C es contado de referencia, por lo que los objetos se eliminan cuando la referencia el recuento llega a 0.liberación reduce la referencia de recuento de inmediato, autorelease lo reduce cuando el autorelease-piscina se extrae

cuándo usar:

uso autorelease la hora de asignar el objeto si

  • no después de la necesidad función actual
  • será reintegrado por algún otro objeto/función y será liberado por el código de retención
  • cuando la lógica de la función actual sea complicada, por lo que tendría que enviar una versión en una docena de lugares diferentes antes de hacer un retorno

uso "manual" liberar

  • para revertir un anterior retener (en caso de que esté implementando una biblioteca)
  • si necesita un control preciso de la liberación objetos (p. ej. que utilizan una gran cantidad de memoria o la piscina autorelease no se pueden hacer estallar por algún tiempo)

pero realmente mi freand:

  • leyó el Memory Management Programming Guide for Cocoa según lo sugerido por Barry y ejecutar el código con los instrumentos (zombies y fugas) a menudo para detectar cualquiera y casi todos los errores de administración de memoria.

Erik

7

medios que suelte eso de inmediato Liberar. Autoreleasing significa que desea que la variable se libere en el siguiente grupo de autorrelease.

Utiliza la liberación automática cuando desea mantener la variable pero no desea crear una pérdida de memoria. Utiliza el lanzamiento cuando ya no necesita la variable.

muestra:

- (NSNumber *)return5 { 
    NSNumber * result = [[NSNumber alloc]initWitnInt: 5]; 
    [result autorelease]; 
    return result; 
} 

¿Por qué usamos autorelease allí?

Si usamos [result release] en su lugar, el resultado variable se destruirá en ese momento. Lo que significa que el valor devuelto será basura.

Si no lo lanzamos, la variable result se mantendrá FOREVER incurriendo en pérdida de memoria.

Podemos decirle a cada persona que llama a la función para liberar el resultado, pero eso sería un dolor de cabeza y propenso a errores.

Así que utilizamos la liberación automática. Marcamos la variable que se lanzará en el siguiente grupo de autorrelease. Básicamente, marcamos la variable que se lanzará cerca de la alloc. Por lo tanto, la asignación de mantra se empareja con la liberación en la misma función que se mantiene todo el tiempo.

En realidad, hará bien cambiando todas las versiones en liberación automática. Su uso de memoria no será eficiente, sin embargo, el efecto es mínimo. Todas las variables, en todo el lenguaje de programación, se liberan automáticamente.

De todos modos, use ARC.

Cuestiones relacionadas