2013-02-04 85 views
10

我在NSMutableDictionary存储花栗鼠物理学cpShape对象由NSValue对象和下面的代码行的方式:将NSValue转换回存储在其中的结构类型?

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

我现在需要得到cpShape退了出来,将其与另一种形状。我怎样才能做到这一点?我在NSValue中看到一个getValue:方法,但它需要一个缓冲区,不太确定如何处理它。

回答

12

因此,通过trojanfoe答案只有部分正确。

有一个巨大的这样做的问题。当以这种方式创建NSValue时,您正在复制cpShape结构,并将其取出,然后再次复制它。 cpShape结构几乎完全由参考使用。每次复制它时,都会获得对新副本的新引用,并且其中一些副本存在于堆栈中,并被自动且无声地破坏。非常非常糟糕。

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

+0

并且使用'cpShape *'是*无问题*?我不这么认为,除非非常小心地使用,否则会导致潜伏的错误。 – trojanfoe

+0

@slembcke您可以详细阐述为什么在当前堆栈框架中创建结构体的副本不好(或者比传递指向结构体的指针差)?或者是由于花栗鼠的运作方式? – dev

6

是不是很简单:

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

它会出现如此,是的。我错过了关于参考的课程,很清楚;) – Luke