从`NSValue`获取缓冲区指针

时间:2014-12-05 11:43:49

标签: objective-c pointers nsvalue

我想获得一个指向存储在NSValue中的对象的指针,以便我可以修改它。要点是这样的:

// Get a pointer to the value's buffer (it'd be void*, I guess).
CGRect *myRect = [rectValue getPointer];

// Modify the rectangle.
myRect->origin = CGPointMake(10, 10);

我注意到NSValue有方法pointerValue,但文档说:

  

该值作为指向void的指针。如果未创建值对象来保存指针大小的数据项,则结果是未定义的。

...所以这似乎只适用于指针的值,这不是,CGRect

顺便说一句,如果答案是“你不能这样做”,就我而言,这仍然是一个很好的答案:-)解释为什么不会有意思,如同它似乎就像API中的一个非常明显的缺席。

1 个答案:

答案 0 :(得分:1)

我相信答案确实是,“你不能这样做。”*

以下是为什么会出现这种情况的几个原因。

    与目标C中的许多核心数据类型一样,
  • NSValue不可变的。允许您获取指向存储在实例中的内部值的指针对其不可变性不是很好。
  • 访问此类指针不可避免地必须返回void *。这规避了所有编译器的类型检查能力,这对你自己有好处!
  • 一般来说,课程尽可能地将外部状态和功能尽可能地隐藏在外部世界之外,并仔细管理与外部世界的互动。想象一下NSValue实例想要在每次以CGRect的形式访问其存储值时都知道的愚蠢情况(据我所知,NSValue实际上并未对此进行监控)。使用指针,它无法知道你何时这样做。但是,使用方法-[NSValue CGRectValue],您别无选择,只能通知它。

特别是面对前两个原因,你甚至可以对自己说,如果这一切都是真的,为什么pointerValue存在?这确实可能允许可变性,它确实可能允许指针不被类型检查。很好的问题,但很容易回答:如果你创建一个带有指针的NSValue实例 - 比如用+[NSValue valueWithPointer:],那么将该指针从实例中取回的唯一选择是返回{{1 }}。其他任何东西都会构成方法

的某种假设

*“不能”是这里的相对术语。例如,如果您知道内部密钥名称,则void *可能仍然有效。

相关问题