Warum hat das isa-Feld von Objective C-Objekt einen Offset mit seinem Klassenzeiger?

8

Ich versuche, den folgenden Code zu verwenden, um das C-Struct-Layout von NSObject zu verstehen. Zuerst drucke ich das Strukturlayout mit NSData, dann drucke ich den Klassenzeiger direkt mit [NSObject class] .

%Vor%

Und ich habe das Ergebnis:

%Vor%

Interessant ist, dass das Ende des Klassenzeigers e0f0 ist, während das NSData Druckergebnis sein isa als eof1 zeigt (wegen des kleinen Endian ist es in umgekehrter Reihenfolge) . Ich habe in Buch gelesen, dass der ISA-Zeiger im Struct-Layout eines Objekts oberste ist, also warum hat 1 Offset ?

Übrigens habe ich auch andere Arten von Objekten ausprobiert, es gibt immer 1 offset zwischen isa und class pointer. Sollten sie nicht gleich sein?

P.S. Ich habe gerade bemerkt, dass der Klassenzeiger mit 0x7fff beginnt, aber die isa in C struct scheint 0xffff zu sein, dieser Unterschied ist auch interessant. Was ist die genaue Beziehung zwischen ISA-Feld und Klassenzeiger aus [NSObject class] ?

    
Zhu Shengqi 15.10.2015, 00:24
quelle

1 Antwort

5

Die 1 im niedrigstwertigen Bit bedeutet, dass isa kein Zeiger ist . Im 64-Bit-Land Die 64 Bits von isa wurden in eine Bitmaske umgewidmet . Auf der signifikantesten Seite der Bitmaske isa sind andere Bitfelder und der Referenzzähler.

Ein Teil der Bitmaske isa (30 Bits in der Mitte) identifiziert das Klassenobjekt, das ist der Teil, den Sie erkannt haben.

    
Jeffery Thomas 15.10.2015, 02:54
quelle