Análisis estructural de clase OC
Nuestra clase OC está compilada en una estructura objc_class
objc_class contiene superclase, caché y bits, y en realidad tiene un atributo oculto isa (heredando de objc_object)
p>
La estructura de la clase es la siguiente
La estructura de la clase también es un objeto, al que llamamos objc_object. Heredado de objc_object
En una imagen, la estructura de una clase es aproximadamente la siguiente
Una clase es en realidad un objeto, al que llamamos objeto de clase. La clase del objeto de clase es la metaclase, que es la metaclase señalada por isa
Como sugiere el nombre, es la clase principal de la clase actual
Métodos que se han llamado se almacenarán en caché aquí para que se puedan encontrar rápidamente cuando se les vuelva a llamar.
bits llama a la función data(), que devuelve una estructura class_rw_t
class_rw_t contiene una lista de métodos, atributos y protocolos, y una estructura class_ro_t
class_ro_t También contiene una lista de métodos, propiedades y protocolos, pero también contiene una lista de métodos, propiedades y protocolos adicionales, y una lista de protocolos. class_rw_t se genera en tiempo de ejecución. class_rw_t se inicializa cuando se carga la clase y copia la lista de métodos, la lista de atributos y la lista de protocolos en class_ro_t mientras guarda class_ro_t. Tenga en cuenta que la lista de variables miembro (ivar_list_t) no se copia aquí. ¿Por qué necesitas class_rw_t? Es importante introducir la clasificación
La clasificación también es una estructura compilada, como se muestra en la siguiente figura. También hay listas de métodos, listas de protocolos y listas de atributos, pero existen diferencias entre las listas de métodos de objetos y las listas de métodos de clases. ¿Por qué no hay distinción en la clase? Porque solo hay métodos de objeto en la clase. rw_t Vale la pena señalar que los métodos en la categoría se insertan hacia adelante, lo que significa que el método de clasificación estará en la parte superior de la clase principal en la lista de métodos
Ahora piense en una pregunta: nuestro método llama a la consulta ¿Qué lista de métodos es? Así es, es la lista de métodos en class_rw_t. Contiene tanto los métodos de la clase principal como los métodos de clasificación. Por eso usamos class_rw_t para consultar la clase principal. class_rw_t
1. ¿Puedes usar atributos directamente en una clase?
Respuesta: No: el uso directo de la propiedad provocará un bloqueo porque no se puede encontrar el método setter o getter. Las propiedades generan una variable miembro y un método definidor o captador de forma predeterminada. Puede agregar propiedades a una clase, pero no generarán variables miembro ni métodos de establecimiento o obtención porque las variables miembro se almacenan en class_ro_t. No puede agregar variables miembro en categorías. Si desea usarlo, puede implementar los métodos setter y getter usted mismo asociándolos con el objeto
2. La categoría tiene el mismo método que la clase principal, entonces, ¿cuál se llamará realmente?
Respuesta: Se llamará a la clase porque los métodos de la clase se insertan hacia adelante en class_rw_t. En la lista de métodos de class_rw_t, los métodos de clase aparecen antes de la clase principal
.