Principios y aplicaciones de iOS-Runtime
Objc_msgSend, solo los objetos pueden enviar mensajes, por lo que comienza con Objc.
Según el número de método SEL, el objeto va a la tabla de mapeo para encontrar el método correspondiente.
1. Método de canje
2. Método de adición dinámica (parece inútil, es mejor clasificar directamente)
3. /p>
4. Diccionario para modelar
5. Archivar y descomprimir archivos rápidamente
6.
Cuando los controles proporcionados por el sistema no pueden satisfacer nuestras necesidades, podemos
1: Extender el comportamiento de las subclases heredando los controles del sistema y anulando los métodos del sistema.
2. Cuando necesite extender otros atributos o métodos para la clase del sistema, debe crear una categoría para la clase relacionada con la clase (el método del sistema no se puede anular en la categoría porque la función del sistema se sobrescribirá y no se podrá llamar a super) en la categoría.
3. Utilice el tiempo de ejecución para modificar las clases del sistema e intercambiar métodos (los métodos llamados por los objetos para enviar mensajes se han intercambiado y las declaraciones no se intercambiarán, por lo que las declaraciones y las llamadas se escriben como un solo método). (Y el método es en realidad Después del intercambio, el objeto llama al método de intercambio).
Lo que realmente se intercambia es la siguiente lista de métodos y el diagrama IMP (mapeo de implementación de métodos).
Antes del intercambio:
Después del intercambio:
Agregando categorías a las clases a modificar. Por ejemplo, el método de denominación de imágenes del sistema de intercambio.
1. Agregar clasificación (imagen de clasificación de UIImage)
1.1 Definir un método del sistema después del intercambio de llamadas al método.
1.2, método en intercambio + carga (nula) (//llamado al cargar la clase en la memoria, solo llamado una vez).
Escenarios de aplicaciones de desarrollo: si hay muchos métodos en una clase y cargar la clase en la memoria requiere muchos recursos, entonces se debe generar una tabla de mapeo para cada método. Puede agregar métodos dinámicamente. una clase Para resolver (llamada por performSelector, implementada por class_addMethod).
Pregunta clásica de la entrevista: ¿Alguna vez has usado performSelector? De hecho, lo que más quiero preguntar es si alguien tiene alguna forma de agregarlo dinámicamente.
Uso simple
La razón por la cual los atributos no se pueden agregar directamente a las categorías:
Use @property para declarar atributos en la categoría y simplemente agregue los atributos a La lista de atributos de la clase declara los métodos setter y getter, pero no genera las variables miembro correspondientes ni implementa los métodos setter y getter. Por lo tanto, no se pueden agregar atributos a las categorías. Al usar @property, el sistema generará automáticamente una variable miembro con "_" y sus métodos setter y getter. En otras palabras, las propiedades son equivalentes a las variables miembro más los métodos getter y setter.
Solución: Después de usar @property para declarar atributos en la categoría, incluso si se implementan los métodos setter y getter, las variables miembro con "_" aún no se agregan, es decir, no se pueden usar en la categoría. Los métodos setter y getter acceden directamente a las variables miembro que comienzan con un guión bajo porque el sistema no agrega variables miembro que comienzan con "" cuando usa @property para declarar propiedades en una categoría. En este momento, puede utilizar el objeto de asociación en tiempo de ejecución para lograr el propósito de agregar.
Principio: Declarar atributos para una clase en realidad agrega una asociación a la clase.
Ejemplo simple
Idea: usar el tiempo de ejecución para recorrer todos los atributos del modelo, buscar claves en el diccionario de acuerdo con los nombres de los atributos del modelo, recuperar los valores correspondientes y asignar valores a los atributos del modelo.
Implementar operaciones de acceso específicas en el controlador.
KVO y KVC pueden aprovechar esto.