#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 не связан. Я удалил эту часть.