2011-01-07 149 views
2

只是試圖理解ObjectiveC更好一點。指針vs零初始化指針

這兩個表達式不應該一樣嗎?

NSString *str; //address of str is 0x438a5625 
NSString *str=nil; //address of str is 0x0 

這種行爲的原因是什麼?

回答

9

在C中,因此Objective C中,變量不會自動初始化;而是,你只是分配了內存,清理它(如果有必要)成爲你的責任。

有時候,這個記憶已經很清楚了,但是大多數情況下,它充滿了垃圾,從其他進程中釋放了內存,或者跳過罐頭的大象;未初始化的自動內存(如你在這裏所擁有的內容)的內容未定義。

永遠不要假定未初始化的內存實際上可用於除賦值以外的其他任何內容!

作爲一個規程問題,在這兩種情況下,當你的意思是「地址」時,你的意思是「價值」。

1

在C中,默認情況下,堆棧分配變量未初始化爲零字節,而全局變量和Objective C對象(已分配alloc)是。

我想這是一個性能方面的問題,它在幾乎所有關於C語言和派生語言的教科書中都受到警告。編譯器也應該警告你,如果你引用本地變量而不先給它賦值。

+0

參見例如http://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#Storage-Class-Specifiers – JesperSM 2011-01-07 10:45:06

3

第二個表達式的結果是清零n0 == 0x0因此str的值是0x0。一般而言,第一個表達式具有未定義的值(意味着可以具有任何值)。它取決於編譯器未初始化變量的值。一些編譯器會將未初始化的變量設置爲0(0x0),但情況並非總是如此。一般來說,編譯器不會將值設置爲任何值,並且變量將包含您獲得的大量內存中的任何值。

iOS SDK中的Objective-C編譯器的細節並不真正相關。最佳做法是不要假設變量獲得默認初始值。因此,第二行是一個更好的方法來初始化一個你不打算立即使用的變量。否則,當您更改編譯器,編譯器更改或變量初始化爲不同值時,您可能會遇到意外的行爲。