2014-09-28 59 views
0

我有這個代碼,我複製我需要記住的浮動。如何正確複製並返回一個CGFloat

- (void) rememberThisFloatForLater:(CGFloat)floatToRemember { 

self.rememberedFloat = &(floatToRemember); 

} 

這裏是self.rememberedFloat在頭文件...

@property (assign) CGFloat *rememberedFloat; 

我的問題就在這裏,當我嘗試返回記住的浮動。當我返回時,我得到6.92867051318e-310,我應該得到3.14159265359,因爲這是floatToRemember等於什麼。我哪裏錯了?

- (CGFloat) floatYouShouldRemember { 

return *(self.rememberedFloat); 
} 

回答

3

CGFloat是一種原始類型。這將是非常非常,非常不尋常的是,你將有一個類型爲CGFloat *的屬性。改用CGFloat。

想想你一直在做的事情:floatToRemember是一個方法參數,它與局部變量大致相同。您正在獲取該變量的地址並將其存儲。然後你的方法返回。這意味着局部變量消失。這意味着它的地址現在完全是垃圾。實際上比徹底的垃圾更糟糕;它是一個不確定的值,幾乎所有使用它的操作都是未定義的行爲,如果你幸運的話可以立即崩潰你的程序(或者當客戶使用它時,如果你不幸運,可能會導致程序崩潰)。

+0

編輯:我明白你現在說的話。我拿走了標題中的指針,並且在下面的兩個方法中改變了它。感謝您指出我的簡單錯誤:) – Jon 2014-09-28 23:51:41

+0

可能更好,但這是正確的。基元足夠小,可以直接訪問,而不是通過引用,因此只需將它們複製即可。有時候你需要一個指針作爲方法參數的基元,但這是一個更高級的用例。 – axiixc 2014-09-28 23:52:55

+0

簡短的答案是CGFloat是一種主要類型 - 你不需要做任何事情來複制它。只需分配它。 – Paulw11 2014-09-28 23:54:12

相關問題