2009-06-13 38 views

回答

110

是的,類實例變量始終初始化爲0(或者nil,NULLfalse,具體取決於確切的數據類型)。見Objective-C 2.0 Programming Language

alloc方法動態分配內存爲新對象的實例變量,並將其全部初始化爲0,所有的,也就是說,除了新的實例連接到其類isa變量。


編輯2013年5月8日
蘋果似乎已經刪除了上述文件(現在連接到自由之路機)。 (目前)活動文檔Programming With Objective-C包含一個類似的引文:

alloc方法有另外一個重要的任務,這是由他們設置爲零來清除分配給對象的屬性內存。這樣可以避免以前存儲的內容中包含垃圾的常見問題,但不足以完全初始化對象。


然而,這僅真正一類的實例變量;它也適用於全球範圍內聲明的POD類型:

// At global scope 
int a_global_var; // guaranteed to be 0 
NSString *a_global_string; // guaranteed to be nil 

有一個例外,它是真正的局部變量,或與malloc()realloc()分配的數據;它是calloc()真實的,因爲calloc()明確零出它分配的內存。

一個例外是,當自動引用計數(ARC)被使能,堆棧指針Objective-C的對象被隱式地初始化爲nil;但是,將它們明確初始化爲nil仍然是一個好習慣。從Transitioning to to ARC Release Notes

堆棧變量與nil

使用ARC,強,弱,並自動釋放堆棧變量初始化正在暗中與nil

在C初始化++(和C++對象是在Objective-C++)中使用,類的實例變量也零初始化。你必須在你的構造函數中明確地初始化它們。

+3

現貨。然而,人們經常對這個細節感到疑惑的事實足以使變量初始化更明確,可以說是「更安全」的選擇。初始化爲0/nil/NULL從不傷害任何人...... :-) – 2009-06-13 16:36:30

-1

我不認爲你應該承擔任何初始值。如果圍繞「0」值構建邏輯,則應將其設置爲確定。

+0

我認爲我們可以看到這是C++的有效答案,而Adam的答案適用於Objective-C? – Felixyz 2009-06-13 15:41:42

+11

Adam對Objective C的回答是完全正確的 - Objective C絕對保證ivars在分配時被設置爲nil/NULL/false/0,接受和使用這個事實是非常明智的。例如,這可以使NSMultableArray * ivars在[NSMultableArray數組或新]之間進行簡單的延遲初始化,當它們被注意到爲零時。結合Objective C guarentteing [(NSMultableArray *)count]返回0,通常可以進一步推遲初始化。學會熱愛Objective C這樣做的方式,而不是僅僅與它的差異作鬥爭。 – 2009-06-15 01:52:11

-2

是的,在C全局變量初始化爲零。在Objective-C中,即使局部變量也被初始化爲零。 你可以依靠它。