Principio básico débil de IOS
Powerless
blogs.com/guohai-stronger/p/10161870.html
/p/2b12666b351f
Débil es una referencia débil. El uso de débil para modificar y describir el contador del objeto referenciado no aumentará en 1. Cuando se libera el objeto referenciado, débil se establecerá automáticamente en cero, evitando así la situación en la que un puntero salvaje accede a mal. memoria y provoca un bloqueo.
Débil también puede resolver referencias circulares.
Assign se puede utilizar para modificar tipos de datos básicos y objetos OC. Sin embargo, si el tipo de objeto se modificó asignando puntos a un puntero fuerte, luego de liberar el puntero, seguirá apuntando a esta memoria y deberá establecerse manualmente en cero; de lo contrario, se generará un puntero salvaje. Si aún opera la memoria a través de este puntero, provocará un error de acceso EXC _bad_ y llamará al espacio de memoria que se ha liberado.
Débil solo se puede utilizar para modificar objetos OC, lo cual es más seguro que la asignación. Si el objeto señalado desaparece, se establece automáticamente en nulo, lo que no da como resultado un puntero comodín.
ARC es el resultado de la colaboración en tiempo de ejecución de LLVM+.
Después de activar ARC, el compilador LLVM generará automáticamente la liberación, la retención y la liberación automática para nosotros en las ubicaciones correspondientes.
Agregar liberación al final del rango (llaves).
Manejar referencias débiles en tiempo de ejecución.
El método débil compilado implementa el método débil a través de objc_ownership (débil), que literalmente significa: obtener la propiedad del objeto es la operación débil de inicializar el objeto.
Al compilar y analizar lo débil, podemos ver que el tiempo de ejecución inicializa y mantiene lo débil;
Débil y fuerte son ambos modificadores de los arcos OC, y fuerte es el tiempo de ejecución El conteo automático Estructura de la mesa mantenida en todo momento.
El valor de la dirección de un puntero débil es la dirección del puntero del objeto al que apunta.
La estructura de tabla débil_entry_t se utiliza para almacenar objetos definidos por débil en la tabla global débil débil_table_t.
Weak_entry_t es una estructura interna almacenada en la tabla de referencia débil, responsable de mantener y almacenar todos Una tabla hash de referencia débil que apunta a un objeto.
Puedes ver el ptr privado de derechos
En otras palabras, débil_referrer_t es un alias de objc_object **
Al inicializar una variable débil, el tiempo de ejecución llamará a The La función objc_initWeak inicializa la dirección del objeto señalado por el nuevo puntero débil;
La función objc_storeWeak() se llamará dentro de la función objc_initWeak. La función objc_storeWeak() se utiliza para actualizar el puntero y crear un puntero débil. tabla de referencia.
Finalmente, se llamará a la función clearDeallocating. La función clearDeallocating primero obtiene una matriz de direcciones de puntero débiles según la dirección del objeto, luego atraviesa la matriz, primero la establece en cero, elimina la entrada de la tabla débil y finalmente borra los registros del objeto.
¿Cómo establece el compilador un puntero débil en cero cuando se libera el objeto señalado por el puntero débil?
Las referencias débiles se almacenan en la tabla de referencias débiles (tabla hash). Cuando se destruye el objeto, la referencia débil del objeto actual se saca de la tabla y se borra.
Nota: consulte el puntero isa para la tabla auxiliar, débil_table_t, débil_entry_t.