Objects in memory
CFRuntimeClass
Objetos CF* vêm do CoreFoundation, que fornece mais de 50 classes de objetos como CFString
, CFNumber
ou CFAllocatior
.
Todas essas classes são instâncias da classe CFRuntimeClass
, que quando chamada retorna um índice para a __CFRuntimeClassTable
. O CFRuntimeClass é definido em CFRuntime.h:
Objective-C
Seções de memória utilizadas
A maioria dos dados utilizados pelo tempo de execução do ObjectiveC mudará durante a execução, portanto ele utiliza algumas seções do segmento __DATA na memória:
__objc_msgrefs
(message_ref_t
): Referências de mensagem__objc_ivar
(ivar
): Variáveis de instância__objc_data
(...
): Dados mutáveis__objc_classrefs
(Class
): Referências de classe__objc_superrefs
(Class
): Referências de superclasse__objc_protorefs
(protocol_t *
): Referências de protocolo__objc_selrefs
(SEL
): Referências de seletor__objc_const
(...
): Dados da classer/o
e outros dados (esperançosamente) constantes__objc_imageinfo
(versão, flags
): Usado durante o carregamento da imagem: Versão atualmente0
; Flags especificam suporte pré-otimizado para GC, etc.__objc_protolist
(protocol_t *
): Lista de protocolo__objc_nlcatlist
(category_t
): Ponteiro para Categorias Não-Lazy definidas neste binário__objc_catlist
(category_t
): Ponteiro para Categorias definidas neste binário__objc_nlclslist
(classref_t
): Ponteiro para classes Objective-C Não-Lazy definidas neste binário__objc_classlist
(classref_t
): Ponteiros para todas as classes Objective-C definidas neste binário
Também utiliza algumas seções no segmento __TEXT
para armazenar valores constantes se não for possível escrever nesta seção:
__objc_methname
(C-String): Nomes de método__objc_classname
(C-String): Nomes de classe__objc_methtype
(C-String): Tipos de método
Codificação de Tipo
Objective-C utiliza algumas manipulações para codificar seletores e tipos de variáveis de tipos simples e complexos:
Tipos primitivos usam a primeira letra do tipo
i
paraint
,c
parachar
,l
paralong
... e usa a letra maiúscula no caso de ser não assinado (L
paraunsigned Long
).Outros tipos de dados cujas letras são usadas ou são especiais, usam outras letras ou símbolos como
q
paralong long
,b
parabitfields
,B
parabooleans
,#
paraclasses
,@
paraid
,*
paraponteiros de char
,^
paraponteiros genéricos
e?
paraindefinido
.Arrays, estruturas e uniões usam
[
,{
e(
Exemplo de Declaração de Método
O seletor seria processString:withOptions:andError:
Codificação de Tipo
id
é codificado como@
char *
é codificado como*
A codificação de tipo completa para o método é:
Análise Detalhada
Tipo de Retorno (
NSString *
): Codificado como@
com comprimento 24self
(instância do objeto): Codificado como@
, no deslocamento 0_cmd
(seletor): Codificado como:
, no deslocamento 8Primeiro argumento (
char * input
): Codificado como*
, no deslocamento 16Segundo argumento (
NSDictionary * options
): Codificado como@
, no deslocamento 20Terceiro argumento (
NSError ** error
): Codificado como^@
, no deslocamento 24
Com o seletor + a codificação, é possível reconstruir o método.
Classes
Classes em Objective-C são uma struct com propriedades, ponteiros de métodos... É possível encontrar a struct objc_class
no código-fonte:
Esta classe usa alguns bits do campo isa para indicar algumas informações sobre a classe.
Em seguida, a struct tem um ponteiro para a struct class_ro_t
armazenada no disco que contém atributos da classe como seu nome, métodos base, propriedades e variáveis de instância.
Durante a execução, uma estrutura adicional class_rw_t
é usada contendo ponteiros que podem ser alterados, como métodos, protocolos, propriedades...
Last updated