Почему поле 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 бит в середине) идентифицирует объект класса, который является частью, которую вы узнали.