Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 目标C内存布局:64位指针最高2位的含义?_Ios_Objective C_Memory - Fatal编程技术网

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

Ios 目标C内存布局:64位指针最高2位的含义?,ios,objective-c,memory,Ios,Objective C,Memory,在调试一堆nsindepath对象时,我注意到其中一个对象有一个不寻常的指针 其中一个索引路径的地址为0xc000000388400016。因此,它将两个最高位设置为1。出于兴趣,我想知道这意味着什么。我知道最低位用于标记指针,但在本例中最低位为0。哪些对象映射到此高地址范围?它是64位代码中的标记指针对象 请在此处查看更多信息: 它以64位代码标记指针对象 请在此处查看更多信息: 为了给可能在这里着陆的人澄清一点:它实际上是一个带标签的指针,即使低位设置为0。显然,苹果在某个时候改变了标记指针

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


其中一个索引路径的地址为0xc000000388400016。因此,它将两个最高位设置为1。出于兴趣,我想知道这意味着什么。我知道最低位用于标记指针,但在本例中最低位为0。哪些对象映射到此高地址范围?

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

请在此处查看更多信息:


它以64位代码标记指针对象

请在此处查看更多信息:


为了给可能在这里着陆的人澄清一点:它实际上是一个带标签的指针,即使低位设置为0。显然,苹果在某个时候改变了标记指针的实现方式,因此从10.11(?)开始的所有基于iOS的系统(iOS、tvOS、watchOS)和macOS都使用高位来识别标记指针


这是我在推特上从乔·格罗夫那里得到的答案。来源:

为可能在这里着陆的人澄清一点:它实际上是一个带标签的指针,即使低位设置为0。显然,苹果在某个时候改变了标记指针的实现方式,因此从10.11(?)开始的所有基于iOS的系统(iOS、tvOS、watchOS)和macOS都使用高位来识别标记指针


这是我在推特上从乔·格罗夫那里得到的答案。资料来源:

是的,重要的是这一点已经改变了。在过去,标记指针使用较低的位。现在很明显,他们正在使用更高的位。(参见我自己的答案)标记指针经常更改。这是内部的东西,苹果可以做任何他们想做的事情(只要它是兼容的:)而且,来自乔的信息就是来源的信息;)此外,我不建议将带有标记指针的“hacks”用于除教育以外的任何其他目的:)是的,这里重要的一点是,这已经改变了。在过去,标记指针使用较低的位。现在很明显,他们正在使用更高的位。(参见我自己的答案)标记指针经常更改。这是内部的东西,苹果可以做任何他们想做的事情(只要它是兼容的:)而且,来自乔的信息就是来源的信息;)此外,我不建议将带有标记指针的“hacks”用于教育以外的任何其他目的:)
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