2013-02-04 60 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