11

我将 Chipmunk Physics 的cpShape对象存储在NSMutableDictionary对象NSValue和以下代码行中:

NSValue *shapeValue = [[NSValue alloc] initWithBytes: shape objCType: @encode(cpShape)];
[staticBodiesInUse setObject: shapeValue forKey: name];

我现在需要把cpShape背面拿出来,把它和另一个形状比较。我怎样才能做到这一点?我看到了一个getValue:方法,NSValue但它需要一个缓冲区,不太确定如何处理它。

4

2 回答 2

15

所以特洛伊木马的答案只是部分正确。

这样做有很大的问题。当您以NSValue这种方式创建时,您正在复制cpShape结构,并将其取回,您正在再次复制它。cpShape结构几乎完全通过引用来使用。每次复制它时,您都会获得对新副本的新引用,并且其中一些副本存在于堆栈中并被静默自动销毁。非常非常糟糕。

相反,您想创建一个NSValueusing[NSValue valueWithPointer:shape]并使用[value pointerValue]. 这样 NSValue 只存储一个指向原始的指针cpShape

于 2013-02-05T01:29:55.217 回答
8

是不是很简单:

NSValue *value = [staticBodiesInUse objectForKey:name];
cpShape shape;
[value getValue:&shape];
于 2013-02-04T11:42:13.217 回答