Objects in memory
CFRuntimeClass
Los objetos CF* provienen de CoreFoundation, que proporciona más de 50 clases de objetos como CFString
, CFNumber
o CFAllocatior
.
Todas estas clases son instancias de la clase CFRuntimeClass
, la cual al ser llamada devuelve un índice a la __CFRuntimeClassTable
. CFRuntimeClass está definida en CFRuntime.h:
Objective-C
Secciones de memoria utilizadas
La mayoría de los datos utilizados por el tiempo de ejecución de ObjectiveC cambiarán durante la ejecución, por lo tanto utiliza algunas secciones del segmento __DATA en la memoria:
__objc_msgrefs
(message_ref_t
): Referencias de mensajes__objc_ivar
(ivar
): Variables de instancia__objc_data
(...
): Datos mutables__objc_classrefs
(Class
): Referencias de clases__objc_superrefs
(Class
): Referencias de superclases__objc_protorefs
(protocol_t *
): Referencias de protocolos__objc_selrefs
(SEL
): Referencias de selectores__objc_const
(...
): Datos de claser/o
y otros datos (con suerte) constantes__objc_imageinfo
(versión, flags
): Utilizado durante la carga de imagen: Versión actualmente0
; Las banderas especifican soporte preoptimizado de GC, etc.__objc_protolist
(protocol_t *
): Lista de protocolos__objc_nlcatlist
(category_t
): Puntero a Categorías No Perezosas definidas en este binario__objc_catlist
(category_t
): Puntero a Categorías definidas en este binario__objc_nlclslist
(classref_t
): Puntero a clases Objective-C No Perezosas definidas en este binario__objc_classlist
(classref_t
): Punteros a todas las clases Objective-C definidas en este binario
También utiliza algunas secciones en el segmento __TEXT
para almacenar valores constantes si no es posible escribir en esta sección:
__objc_methname
(Cadena-C): Nombres de métodos__objc_classname
(Cadena-C): Nombres de clases__objc_methtype
(Cadena-C): Tipos de métodos
Codificación de tipos
Objective-C utiliza un cierto enmascaramiento para codificar los tipos de selector y variables de tipos simples y complejos:
Los tipos primitivos usan la primera letra del tipo
i
paraint
,c
parachar
,l
paralong
... y usa la letra mayúscula en caso de que sea sin signo (L
paraunsigned Long
).Otros tipos de datos cuyas letras se utilizan o son especiales, usan otras letras o símbolos como
q
paralong long
,b
parabitfields
,B
parabooleans
,#
paraclasses
,@
paraid
,*
parachar pointers
,^
parapunteros
genéricos y?
paraindefinido
.Los arreglos, estructuras y uniones usan
[
,{
y(
Ejemplo de Declaración de Método
El selector sería processString:withOptions:andError:
Codificación de Tipos
id
se codifica como@
char *
se codifica como*
La codificación completa de tipos para el método es:
Desglose Detallado
Tipo de Retorno (
NSString *
): Codificado como@
con longitud 24self
(instancia del objeto): Codificado como@
, en el desplazamiento 0_cmd
(selector): Codificado como:
, en el desplazamiento 8Primer argumento (
char * input
): Codificado como*
, en el desplazamiento 16Segundo argumento (
NSDictionary * options
): Codificado como@
, en el desplazamiento 20Tercer argumento (
NSError ** error
): Codificado como^@
, en el desplazamiento 24
Con el selector + la codificación puedes reconstruir el método.
Clases
Las clases en Objective-C son una estructura con propiedades, punteros a métodos... Es posible encontrar la estructura objc_class
en el código fuente:
Esta clase utiliza algunos bits del campo isa para indicar información sobre la clase.
Luego, la estructura tiene un puntero a la estructura class_ro_t
almacenada en disco que contiene atributos de la clase como su nombre, métodos base, propiedades y variables de instancia.
Durante el tiempo de ejecución, se utiliza una estructura adicional class_rw_t
que contiene punteros que pueden ser modificados, como métodos, protocolos, propiedades...
Last updated