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]
.
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]
?
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.
Tags und Links c objective-c pointers struct objective-c-runtime