2009-04-28 8 views

Respuesta

25

Tenga en cuenta que los comentarios sobre la respuesta de oxigen diciendo que -drain no libera NSAutoreleasePool no son correctos. El documentation for NSAutoreleasePool dice claramente que -drain libera (y así destruye) el NSAutoreleasePool.

-drain reemplaza el uso de los objetos de liberación de NSAutorelease, la única diferencia es que proporciona una pista para el sistema de recolección de basura.

+0

Gracias. Entonces, en iPhone OS, es mejor usar "liberar" en lugar de "liberar". – Thanks

+1

En un entorno que no es de GC, son lo mismo. Excepto en el raro caso en que no desee proporcionar una pista al sistema GC por algún motivo si el código alguna vez se usó en el modo GC, no hay razón para usar la versión en lugar de drenar en la segmentación de código 10.4+. – smorgan

+1

Apple usa -release para el ARP en la función main() ... – Thanks

10

Si el sistema dispone de una colección de basura, a continuación, enviar el mensaje -Vaciado (objc_collect_if_needed) para GC

Si no lo ha GC, escurrir = liberar

+0

por lo que un disco también liberaría el grupo en sí, ¿no? – Thanks

+1

-los métodos de retención y -difusión no cambian el objeto retainCount of NSAutoreleasePool Sólo envían un mensaje de versión a todos los objetos en el grupo No sé cómo y cuándo los objetos NSAutorelease están destruyendo ((( – oxigen

+1

) No, drain libera el No hay ninguna magia cuando se trata de autorreleases y retiene conteos, ellos siguen las mismas reglas que cualquier otro objeto, excepto que no pueden ser retenidos o lanzados automáticamente (lo cual no tendría mucho sentido de todos modos) –

10

Oxigen es correcto, consulte la documentación para el método drainNSAutoreleasePool de:

En un entorno de referencia contado, comunicados y pops el receptor; en un entorno recogido de basura , desencadena la recolección de elementos no utilizados si la memoria asignada desde la última colección es mayor que el umbral actual.

Cuestiones relacionadas