Red de conocimiento informático - Aprendizaje de programación - La diferencia entre MRC, ARC y liberación automática

La diferencia entre MRC, ARC y liberación automática

Por lo tanto, return es una llamada al método sidetable_retain, observe la implementación de sidetable_retain:

Puede ver que return almacena el recuento de referencias a través de la estructura de datos de Sidetable, aquí está el implementación de Sidetable:

Puede ver que Sidetable almacena un bloqueo de giro y un mapa de recuento de referencias que utiliza la dirección del objeto como clave y el recuento de referencias como valor. El recuento de referencias subyacente es claro. aquí.

La liberación también es relativamente clara aquí: busque la asignación, reste 1 del recuento de referencias, si el recuento de referencias es menor que el umbral, llame a SEL_dealloc

Arriba, el rol de el método de liberación automática es El objeto se coloca en el grupo de liberación automática y luego se devuelve al drenaje del grupo cuando se libera el objeto. Cuando se produce el drenaje de la piscina, los objetos en la piscina serán devueltos a la piscina. Por ejemplo:

Cuando se colocan en el grupo de liberación automática:

Como puede ver, los objetos colocados en el grupo de liberación automática se liberarán una vez que salgan del alcance. De hecho, después de que se inicia el programa iOS, el hilo principal iniciará un Runloop, que se envuelve en un grupo de liberación automática en cada ciclo y borra los objetos del grupo en el momento apropiado.

Entonces, ¿cómo se lanza autoreleasepool?

Como puedes ver, colocar un objeto en el grupo de liberación automática es una llamada al método AutoreleasePoolPage::autorelease.

Echemos un vistazo a la implementación correspondiente:

Hasta ahora, la implementación del método de liberación automática ha sido relativamente clara.

El método autorelease almacena el objeto en la lista vinculada de AutoreleasePoolPage. Cuando se libera el grupo de liberación automática, elimina los objetos almacenados en la lista vinculada. Por lo tanto, AutoreleasePoolPage es la implementación interna del grupo de liberación automática.