我想获得一个指向存储在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中的一个非常明显的缺席。
答案 0 :(得分:1)
我相信答案确实是,“你不能这样做。”*
以下是为什么会出现这种情况的几个原因。
NSValue
是不可变的。允许您获取指向存储在实例中的内部值的指针对其不可变性不是很好。 void *
。这规避了所有编译器的类型检查能力,这对你自己有好处!NSValue
实例想要在每次以CGRect
的形式访问其存储值时都知道的愚蠢情况(据我所知,NSValue
实际上并未对此进行监控)。使用指针,它无法知道你何时这样做。但是,使用方法-[NSValue CGRectValue]
,您别无选择,只能通知它。特别是面对前两个原因,你甚至可以对自己说,如果这一切都是真的,为什么pointerValue
存在?这确实可能允许可变性,它确实可能允许指针不被类型检查。很好的问题,但很容易回答:如果你创建一个带有指针的NSValue
实例 - 比如用+[NSValue valueWithPointer:]
,那么将该指针从实例中取回的唯一选择是返回{{1 }}。其他任何东西都会构成方法
*“不能”是这里的相对术语。例如,如果您知道内部密钥名称,则void *
可能仍然有效。