Objects in memory
CFRuntimeClass
CF* Objekte stammen aus CoreFoundation, die mehr als 50 Klassen von Objekten wie CFString
, CFNumber
oder CFAllocatior
bereitstellt.
All diese Klassen sind Instanzen der Klasse CFRuntimeClass
, die beim Aufruf einen Index zur __CFRuntimeClassTable
zurückgibt. Die CFRuntimeClass ist in CFRuntime.h definiert:
Objective-C
Verwendete Speicherbereiche
Die meisten Daten, die vom ObjectiveC-Laufzeitumgebung verwendet werden, ändern sich während der Ausführung, daher verwendet sie einige Abschnitte aus dem __DATA-Segment im Speicher:
__objc_msgrefs
(message_ref_t
): Nachrichtenreferenzen__objc_ivar
(ivar
): Instanzvariablen__objc_data
(...
): Veränderliche Daten__objc_classrefs
(Class
): Klassenreferenzen__objc_superrefs
(Class
): Superklassenreferenzen__objc_protorefs
(protocol_t *
): Protokollreferenzen__objc_selrefs
(SEL
): Selektorreferenzen__objc_const
(...
): Klassenr/o
-Daten und andere (hoffentlich) konstante Daten__objc_imageinfo
(version, flags
): Wird während des Bildladens verwendet: Aktuelle Version0
; Flags spezifizieren voroptimierte GC-Unterstützung, etc.__objc_protolist
(protocol_t *
): Protokollliste__objc_nlcatlist
(category_t
): Zeiger auf in dieser Binärdatei definierte Non-Lazy-Kategorien__objc_catlist
(category_t
): Zeiger auf in dieser Binärdatei definierte Kategorien__objc_nlclslist
(classref_t
): Zeiger auf in dieser Binärdatei definierte Non-Lazy-Objective-C-Klassen__objc_classlist
(classref_t
): Zeiger auf alle in dieser Binärdatei definierten Objective-C-Klassen
Es verwendet auch einige Abschnitte im __TEXT
-Segment, um konstante Werte zu speichern, falls es nicht möglich ist, in diesem Abschnitt zu schreiben:
__objc_methname
(C-String): Methodennamen__objc_classname
(C-String): Klassennamen__objc_methtype
(C-String): Methodentypen
Typkodierung
Objective-C verwendet einige Verfremdungen, um Selektor- und Variablentypen von einfachen und komplexen Typen zu kodieren:
Primitive Typen verwenden ihren ersten Buchstaben des Typs
i
fürint
,c
fürchar
,l
fürlong
... und verwenden den Großbuchstaben, falls es sich um einen unsigned-Typ handelt (L
fürunsigned Long
).Andere Datentypen, deren Buchstaben verwendet werden oder speziell sind, verwenden andere Buchstaben oder Symbole wie
q
fürlong long
,b
fürBitfelder
,B
fürBooleans
,#
fürKlassen
,@
fürid
,*
fürZeiger auf char
,^
für generischeZeiger
und?
fürundefiniert
.Arrays, Strukturen und Unionen verwenden
[
,{
und(
Beispiel Methodendeklaration
Der Selektor wäre processString:withOptions:andError:
Typencodierung
id
wird als@
codiertchar *
wird als*
codiert
Die vollständige Typencodierung für die Methode lautet:
Detaillierte Aufschlüsselung
Rückgabetyp (
NSString *
): Codiert als@
mit einer Länge von 24self
(Objektinstanz): Codiert als@
, bei Offset 0_cmd
(Selektor): Codiert als:
, bei Offset 8Erstes Argument (
char * input
): Codiert als*
, bei Offset 16Zweites Argument (
NSDictionary * options
): Codiert als@
, bei Offset 20Drittes Argument (
NSError ** error
): Codiert als^@
, bei Offset 24
Mit dem Selektor und der Codierung können Sie die Methode rekonstruieren.
Klassen
Klassen in Objective-C sind eine Struktur mit Eigenschaften, Methodenzeigern... Es ist möglich, die Struktur objc_class
im Quellcode zu finden:
Diese Klasse verwendet einige Bits des isa-Feldes, um Informationen über die Klasse anzuzeigen.
Dann hat die Struktur einen Zeiger auf die auf der Festplatte gespeicherte Struktur class_ro_t
, die Attribute der Klasse wie ihren Namen, Basismethoden, Eigenschaften und Instanzvariablen enthält.
Während der Laufzeit wird eine zusätzliche Struktur class_rw_t
verwendet, die Zeiger enthält, die geändert werden können, wie Methoden, Protokolle, Eigenschaften...
Last updated