Что означает значение 0x80..00 в objc-weak.h (код среды выполнения objc)

#ios #objective-c

#iOS #objective-c

Вопрос:

Я изучаю исходный код среды выполнения objc и не могу понять, что такое 0x80..00 . Это происходит из комментария в файле objc-weak.h. Комментарий показан ниже:

 // out_of_line_ness field overlaps with the low two bits of inline_referrers[1].
// inline_referrers[1] is a DisguisedPtr of a pointer-aligned address.
// The low two bits of a pointer-aligned DisguisedPtr will always be 0b00
// (disguised nil or 0x80..00) or 0b11 (any other address).
// Therefore out_of_line_ness == 0b10 is used to mark the out-of-line state.
  

Комментарии:

1. я бы подумал о 0xXXXX0b00 или 0xXXXX0b11 или 0xXXXX0b10, которые можно изменить, чтобы выяснить, в каком состоянии они находятся, и при этом оставаться адресом. длина адреса может варьироваться в зависимости от системы, поэтому точки .. . Надеюсь, я не ошибаюсь.

2. @OlSen «0b» в 0b00 или 0b11 означает цифру в двоичном коде😀

Ответ №1:

DisguisedPtr определяется в obj-private .h, в котором говорится следующее:

 // DisguisedPtr<T> acts like pointer type T*, except the 
// stored value is disguised to hide it from tools like `leaks`.
// nil is disguised as itself so zero-filled memory works as expected, 
// which means 0x80..00 is also disguised as itself but we don't care.
// Note that weak_entry_t knows about this encoding.
  

Комментарии:

1. Сегодня я понимаю, что дополнительные представления 0 (nil) и 0x80..00 по-прежнему равны 0 и 0x80..00. Таким образом, 0x80..00 упоминается в комментариях по этой причине (0x80..00 также маскируется под себя). _OBJC_TAG_MASK равен 0x80000000, но не имеет отношения к 0x80..00 в комментариях objc-weak. Просто совпадение, я прав?

2. Да, я думаю, вы правы, что _OBJC_TAG_MASK не связан. Я удалил эту часть.