Objects in memory
CFRuntimeClass
Об'єкти CF* походять від CoreFOundation, яка надає понад 50 класів об'єктів, таких як CFString
, CFNumber
або CFAllocatior
.
Усі ці класи є екземплярами класу CFRuntimeClass
, який, коли викликається, повертає індекс до __CFRuntimeClassTable
. CFRuntimeClass визначений у CFRuntime.h:
Objective-C
Використані секції пам'яті
Більшість даних, які використовується в роботі ObjectiveC runtime, будуть змінюватися під час виконання, тому вони використовують деякі секції з сегмента __DATA в пам'яті:
__objc_msgrefs
(message_ref_t
): Посилання на повідомлення__objc_ivar
(ivar
): Змінні екземпляра__objc_data
(...
): Змінні дані__objc_classrefs
(Class
): Посилання на класи__objc_superrefs
(Class
): Посилання на суперкласи__objc_protorefs
(protocol_t *
): Посилання на протоколи__objc_selrefs
(SEL
): Посилання на селектори__objc_const
(...
): Дані класуr/o
та інші (сподіваємося) постійні дані__objc_imageinfo
(version, flags
): Використовується під час завантаження зображення: Поточна версія0
; Прапорці вказують на підтримку попередньо оптимізованого GC тощо.__objc_protolist
(protocol_t *
): Список протоколів__objc_nlcatlist
(category_t
): Вказівник на Non-Lazy категорії, визначені в цьому бінарному файлі__objc_catlist
** (category_t
): Вказівник на категорії, визначені в цьому бінарному файлі__objc_nlclslist
(classref_t
): Вказівник на Non-Lazy класи Objective-C, визначені в цьому бінарному файлі__objc_classlist
(classref_t
): Вказівники на всі класи Objective-C, визначені в цьому бінарному файлі
Також використовує деякі секції в сегменті __TEXT
для зберігання постійних значень, якщо неможливо записати в цій секції:
__objc_methname
(C-String): Назви методів__objc_classname
(C-String): Назви класів__objc_methtype
(C-String): Типи методів
Кодування типів
Objective-C використовує деяке замаскування для кодування селекторів та типів змінних простих і складних типів:
Примітивні типи використовують першу літеру типу
i
дляint
,c
дляchar
,l
дляlong
... і використовують велику літеру у випадку беззнакового типу (L
дляunsigned Long
).Інші типи даних, чиї літери вже використовуються або є спеціальними, використовують інші літери або символи, наприклад
q
дляlong long
,b
длябітових полів
,B
длябулевих значень
,#
длякласів
,@
дляid
,*
длявказівників на char
,^
для загальнихвказівників
та?
дляневизначеного
.Масиви, структури та об'єднання використовують
[
,{
та(
Приклад оголошення методу
Селектор буде processString:withOptions:andError:
Кодування типу
id
кодується як@
char *
кодується як*
Повне кодування типу для методу:
Детальний розбір
Тип повернення (
NSString *
): Закодований як@
з довжиною 24self
(екземпляр об'єкта): Закодований як@
, на зміщенні 0_cmd
(селектор): Закодований як:
, на зміщенні 8Перший аргумент (
char * input
): Закодований як*
, на зміщенні 16Другий аргумент (
NSDictionary * options
): Закодований як@
, на зміщенні 20Третій аргумент (
NSError ** error
): Закодований як^@
, на зміщенні 24
З селектором + кодуванням можна відновити метод.
Класи
Класи в Objective-C - це структура з властивостями, вказівниками на методи... Можна знайти структуру objc_class
в вихідному коді:
Цей клас використовує деякі біти поля isa для вказівки деякої інформації про клас.
Потім структура має вказівник на структуру class_ro_t
, збережену на диску, яка містить атрибути класу, такі як його ім'я, базові методи, властивості та змінні екземпляра.
Під час виконання використовується додаткова структура class_rw_t
, яка містить вказівники, які можуть бути змінені, такі як методи, протоколи, властивості...
Last updated