将NSValue转换回存储在其中的结构类型?

时间:2013-02-04 11:34:48

标签: ios objective-c cocoa-touch chipmunk nsvalue

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

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

我现在需要退出cpShape,将其与其他形状进行比较。我怎样才能做到这一点?我在getValue:中看到了一个NSValue方法,但它需要一个缓冲区,不太清楚如何处理它。

2 个答案:

答案 0 :(得分:13)

因此,trojanfoe的答案只是部分正确。

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

相反,您希望使用NSValue创建[NSValue valueWithPointer:shape]并使用[value pointerValue]获取该指针。这样,NSValue只存储指向原始cpShape的指针。

答案 1 :(得分:6)

不是简单的:

NSValue *value = [staticBodiesInUse objectForKey:name];
cpShape shape;
[value getValue:&shape];