Pregunta

Cuando libera un objeto en Objective-C (suponiendo que su recuento de lanzamientos es 1), su recuento de lanzamientos se reduce a 0 y se llama al método dealloc. ¿Se destruye el objeto allí mismo y luego después de [super dealloc], o se agrega al grupo y se destruye cuando se drena el grupo?

Supongo que los objetos liberados se destruyen al final de dealloc (cuando se llama [super dealloc]) Sé que las variables de liberación automática se agregan al grupo, solo quería estar seguro de lo que sucede con los objetos liberados normales.

saludos -gary-

¿Fue útil?

Solución

Primero, Objective-C el lenguaje de programación no tiene ningún concepto de gestión de memoria. La gestión de memoria está integrada en Foundation (el marco común de Cocoa para Mac OS X y Cocoa Touch en iPhone OS) . Foundation agrega un NSObject de clase raíz que implementa alloc , retención , release y autorelease como envoltorios de conveniencia en la parte superior de funciones class_createInstance () y object_dispose () del tiempo de ejecución de Objective-C.

Dado que Objective-C es independiente de la administración de memoria, agregar recolección de basura y hacer que todos los métodos de administración de memoria en NSObject no-ops sea bastante fácil. Pero no hay recolección de basura en iPhone OS y Mac OS X heredado y en su lugar utilizamos un esquema de conteo de referencia en Cocoa.

Se crea un objeto cuando se llama al método de clase alloc en NSObject o NSProxy desde Foundation. Estas implementaciones predeterminadas llamarán a class_createInstance () para que nunca necesite hacerlo manualmente.

Un objeto "muere" cuando dealloc se ejecuta en la clase raíz NSObject . Esto es cuando la memoria para el objeto en el montón se libera llamando a object_dispose () , nunca necesitará llamar a esta función usted mismo siempre que herede de NSObject o NSProxy de Foundation.

Los objetos lanzados automáticamente no se tratan de manera especial en lo que respecta al tiempo de ejecución, un objeto lanzado automáticamente está tan vivo como cualquier otro objeto. Qué sucede cuando liberación automática un objeto es aproximadamente;

-(id)autorelease; {
  [NSAutoreleasePool addObject:self];  // retain count +1
  [self release];                      // retain count -1
  return self;
}

Llamar a liberación automática no disminuirá el recuento de retención, solo transferirá la propiedad del objeto desde la persona que llama al grupo de liberación automática actual. Más tarde, cuando el grupo de liberación automática actual desaparezca, llamará a release en todos los objetos que posee, y cualquier objeto que ya no sea propiedad de otra cosa se liberará.

Otros consejos

Sí, se desasignan tan pronto como el conteo de retención llega a cero.

El sistema de liberación automática es para objetos cuya propiedad es un poco "ambigua" - es decir, cuando devuelve un objeto nuevo que no desea poseer, cuya vida es desconocida, y no desea asumir que la persona que llama asumirá la responsabilidad. Cuando se agota el grupo de liberación automática (generalmente la próxima vez que se ejecuta el ciclo de ejecución), todos los miembros reciben la liberación. Si la persona que llama que recibió su objeto quiere hacerse responsable de él, todo lo que necesita hacer es retenerlo, y esto evitará su desasignación.

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