Почему поле 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 (это в обратном порядке из-за порядкового номера). Я прочитал в книге, что указатель isa является самым верхним в структуре структуры объекта, так почему он имеет 1 смещение?

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

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

1 ответ

Решение

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

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

Другие вопросы по тегам