当我阅读runtime时,
我无法理解该功能是如何运作的。
inline bool
objc_object::isTaggedPointer()
{
return ((uintptr_t)this & TAG_MASK);
}
以下是 TAG_MASK 定义的方式:
#if SUPPORT_MSB_TAGGED_POINTERS
# define TAG_MASK (1ULL<<63)
# define TAG_SLOT_SHIFT 60
# define TAG_PAYLOAD_LSHIFT 4
# define TAG_PAYLOAD_RSHIFT 4
#else
# define TAG_MASK 1
# define TAG_SLOT_SHIFT 0
# define TAG_PAYLOAD_LSHIFT 0
# define TAG_PAYLOAD_RSHIFT 4
#endif
我知道如果 TAG_MASK 等于1,函数返回false。但是当函数返回true时,为什么这个函数可以判断结果。 谢谢!
答案 0 :(得分:0)
标记指针是一种在没有分配的情况下创建对象的方法。
因此,运行时需要能够检测对象是否是对已分配内存块的引用,或者对象指针是否真的是数据。
它通过将“指针”中的一位设置为1来实现这一点。对于常规分配,该位通常始终为0。有两种模式; “最重要的位”和“最低位”。
在LSB模型中,使用第一位。在分配存储器时,所有分配都是对齐的,因此低位不应该为零。通过将其设置为零,运行时可以键入该值以检测标记指针。 MSB模型将位移动到最高插槽(这是安全的,因为没有人应该将存储器映射到具有最高位设置的区域)。
如果在LSB模型中设置了最低位,则 isTaggedPointer()
返回YES / true;如果在MSB模型中设置了最高位,则返回YES / true。