Objective-C中的标记指针

ily*_* n. 19 pointers memory-management runtime objective-c

回答这个问题时,我注意到现代Objective-C运行时使用了标记指针.Mike Ash文章及其评论指出,它们用于某些NSNumberNSDate实例.

这让我想到了不同平台的完整情景表:

OSX/iOS 32/64位Objective-C运行时在哪里使用标记指针?

Gre*_*ker 23

OS X和iOS都使用64位代码中的标记指针对象.目前在32位代码中都没有使用任何标记的指针对象,但原则上它并非不可能.特定的优化类和优化值集经常更改.开源objc4/runtime/objc-internal.h描述了至少一个操作系统版本中使用的这组类:

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
Run Code Online (Sandbox Code Playgroud)

  • [这是 macOS 10.12.4 `objc-internal.h` 的链接](https://opensource.apple.com/source/objc4/objc4-709/runtime/objc-internal.h.auto.html)。 (3认同)