2013-07-29 71 views
2

我剛剛遇到了非常奇怪的錯誤,這可能是由於缺乏Objective C數據類型方面的知識。 如果我這樣做:CGFloat有奇怪的默認值

CGFloat newY; 
NSLog(@"newY is %f", newY); 

登錄返回0.0,雖然我希望爲零,但是這並不是真正的問題。如果我現在將此應用導出到iOS .ipa並從那裏安裝應用,則newY會自動初始化爲185.000。 這個值來自哪裏,爲什麼當應用程序從.ipa安裝而不是直接從XCode安裝?

我真的很感謝任何有關正在發生的事情的見解,這對我沒有任何意義。

+0

在C中,您需要初始化局部變量。你看到的價值是垃圾價值,取決於各種因素。通常情況下,編譯器會警告這類事情。你在這裏忽略了一個警告嗎? – mvds

+0

你需要初始化變量'newY'。否則它會給你垃圾值不是0.0。 –

+0

是的我發現我必須初始化局部變量。我無法理解爲什麼分配不同的值。現在它更有意義。我想我沒有得到任何編譯器警告,因爲我正在遞增foreach循環中的變量newY = newY + 1.0f;非常感謝您的見解。 –

回答

3

newY沒有被初始化爲0,而是在堆棧上發生的任何事情(這是newY的存儲位置)。這可能在不同的平臺上有所不同,但也可能在執行之間改變。

您很可能會收到警告,告訴您在自行初始化之前使用newY是不安全的。

+0

非常感謝您的幫助。實際上沒有任何警告,如果我有任何警告,我肯定會查看它。 –

+0

如果您最初使用的newY是'newY = newY + 1.0f',那麼編譯器可能無法捕捉到。如果第一次使用「other = newY + 1.0f」,你會得到警告嗎? – Aderstedt

+0

是的,我在使用'other = newY + 1.0f'時得到一個警告,所以這就是我以前沒有得到警告的原因。我仍然不明白當通過XCode和獨立運行應用程序時有什麼不同。這是相同的物理設備,相同的操作系統,相同的應用程序。即使使用分離的調試器,應用程序仍然可以按照預期從XCode安裝。我知道這是由於我的錯誤發生的,但很高興知道背景中的差異。 –

1

CGFloat不是一個指針,所以它不能被賦值爲零。

這是一個自動變量,所以它在內存中被賦予了一個位置,並且它取得了已經存儲的值,因爲您沒有初始化它。值是未定義的,所以你應該初始化它。

+1

CGFloat不是一個結構,它是'typedef'在平臺上的'float'或'double'方式。 –

+0

@MaxK。完全正確,我正在考慮CGRect,它已被編輯。 – Oyashiro