Почему поле isa объекта Objective C имеет 1 смещение с указателем класса?

Я пытаюсь использовать следующий код, чтобы понять макет структуры C NSObject. Сначала я печатаю его макет структуры с помощью NSData, затем я печатаю указатель класса напрямую, используя [NSObject class].

id obj = [NSObject new];
long nsSize = class_getInstanceSize([NSObject class]);
NSData *nsData = [NSData dataWithBytes:(__bridge const void *)obj length:nsSize];
NSLog(@"obj: %@", nsData);
NSLog(@"NSObject Class: %p", [NSObject class]);

и я получил результат:

2015-10-15 08:11:53.913 ObjC_CMD[11406:1999149] obj: <f1e06573 ffff1d00>
2015-10-15 08:11:53.913 ObjC_CMD[11406:1999149] NSObject Class: 0x7fff7365e0f0

что интересно, это конец указателя класса e0f0, а NSData результат печати показывает его isa как eof1 (это в обратном порядке из-за маленького эндиана). Я читал в книге, что Иса указатель является самым верхним в макете структуры объекта, поэтому он имеет 1 смещение?

кстати, я также пробовал на других типах объектов, всегда есть 1 смещение между isa и указателем класса. Разве они не должны быть одинаковыми?

С. П. Я только что заметил, что указатель класса начинается с 0x7fff, но isa в структуре C кажется 0xffff, эта разница также интересна. Какова точная связь между полем isa и указателем класса получено из [NSObject class]?

1 ответов


1 в младшем бите означает isa не указатель. В 64-битной земле,64-бит isa были перенацелены в битовую маску. На наиболее значимой стороне isa bit-mask-это другие битовые поля и счетчик ссылок.

часть isa бит-маска (30 бит в середине) идентифицирует объект класса, который является частью, которую вы узнали.