Objective C内存布局:64位指针最高2位的含义?

时间:2017-08-16 10:07:54

标签: ios objective-c memory

在调试一堆NSIndexPath个对象时,我注意到其中一个对象有一个不寻常的指针。

其中一个索引路径的地址为0xc000000388400016。所以它有两个最高位设置为1.出于兴趣,我很想知道这意味着什么。我知道最低位用于标记指针,但在这种情况下最低位为0。哪些对象被映射到这个高地址范围?

2 个答案:

答案 0 :(得分:1)

它是64位代码中的标记指针对象。

点击此处查看更多信息:Github

OBJC_TAG_NSAtom            = 0, 
OBJC_TAG_1                 = 1, 
OBJC_TAG_NSString          = 2, 
OBJC_TAG_NSNumber          = 3, 
OBJC_TAG_NSIndexPath       = 4, 
OBJC_TAG_NSManagedObjectID = 5, 
OBJC_TAG_NSDate            = 6, 
OBJC_TAG_7                 = 7

答案 1 :(得分:1)

为可能落在这里的人们澄清一些事情:它实际上是一个标记指针,即使低位设置为0.显然Apple在某些时候更改了标记指针的实现,以便所有基于iOS的系统(从10.11(?)开始的iOS,tvOS,watchOS)和macOS使用高位来识别标记指针。

这是我在Twitter上从Joe Groff那里得到的答案。资料来源:https://twitter.com/jckarter/status/897856728586309632