Si y no. Terminaría liberando la cadena de memoria pero "filtrando" el objeto NSAutoreleasePool en la memoria usando drenaje en lugar de liberación si ejecuta esto en un entorno de recolección de basura (no administrado por memoria). Esta "fuga" simplemente hace que la instancia de NSAutoreleasePool sea "inalcanzable" como cualquier otro objeto sin punteros fuertes debajo de GC, y el objeto se limpiará la próxima vez que se ejecute GC, lo que muy bien podría ser directamente después de la llamada a -drain
:
desagüe
En un entorno de recolección de elementos no utilizados, activa la recolección de elementos no utilizados si la memoria asignada desde la última recolección es mayor que el umbral actual; de lo contrario se comporta como liberación. ... En un entorno de recolección de basura, este método finalmente llama objc_collect_if_needed
.
De lo contrario, es similar a cómo se -release
comporta sin GC, sí. Como han dicho otros, no -release
es una operación en GC, por lo que la única forma de asegurarse de que el grupo funcione correctamente en GC es a través -drain
, y -drain
en no GC funciona exactamente como-release
en no GC, y podría decirse que comunica su funcionalidad más claramente como bien.
Debo señalar que su declaración "cualquier cosa llamada con new, alloc o init" no debe incluir "init" (pero debe incluir "copy"), porque "init" no asigna memoria, solo configura el objeto (constructor Moda). Si recibió un objeto asignado y su función solo llamó a init como tal, no lo liberaría:
- (void)func:(NSObject*)allocd_but_not_init
{
[allocd_but_not_init init];
}
Eso no consume más memoria de la con la que ya comenzó (asumiendo que init no crea una instancia de los objetos, pero usted no es responsable de ellos de todos modos).