¿Cómo maneja objective-c la resolución del método en time de ejecución?

He leído aquí recientemente que un object objective-c se almacena en el montón como una estructura. La estructura contiene los objects iVars, iVars henetworkingados y el puntero isa.

Estoy tratando de averiguar cuándo envío un post a este object, ¿cómo calcula el time de ejecución el código para ejecutarlo?

Sé que hay un object de class para cada class. ¿Esto también se almacena en el montón?

Creo que la forma en que funciona es que el time de ejecución obtiene el puntero isa de la estructura, lo utiliza para llamar al post en el object de class. ¿Es esto correcto?

En resumen, cada instancia de Objective-C tiene un puntero a su class. La class contiene un deviseio de metadatos que incluye todos los methods implementados por la class. Cuando se envía un post a un object, cuando se llama a un método, el time de ejecución utiliza el puntero a la class para search el método por nombre y llamarlo, si se puede encontrar. Si no se encuentra, el time de ejecución se ve en la superclass (que forma parte de los metadatos de cada class) en la cadena de la inheritance a NSObject. Si finalmente no se puede encontrar el método, el time de ejecución pasa por una serie de esfuerzos de última zanja para ver si se trata de un controller alternativo y eventualmente plantea una exception, si no es así.

Si quieres más detalles que eso, escribí un recorrido multiparte de cómo funciona exactamente el envío del método Objective-C. Está un poco anticuado, no trata con ARC, pointers labeldos o bloques como IMP, pero aún es totalmente aplicable.


Sí, las classs se almacenan en el montón, pero generalmente no en la memory malloc () d. Las classs generalmente se cargan como de solo lectura, compartido, memory. Es decir, solo habrá una copy de la class NSString en la memory para todas las aplicaciones que se ejecutan en el sistema . Puede crear dinámicamente classs sobre la marcha y éstas estarán en el montón normal, pero es atípico.