回答
是的,類實例變量始終初始化爲0(或者nil
,NULL
或false
,具體取決於確切的數據類型)。見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++)中使用,類的實例變量也不零初始化。你必須在你的構造函數中明確地初始化它們。
我不認爲你應該承擔任何初始值。如果圍繞「0」值構建邏輯,則應將其設置爲確定。
我認爲我們可以看到這是C++的有效答案,而Adam的答案適用於Objective-C? – Felixyz 2009-06-13 15:41:42
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
是的,在C全局變量初始化爲零。在Objective-C中,即使局部變量也被初始化爲零。 你可以依靠它。
- 1. OpenCL是否始終將器件內存初始化爲零?
- 2. 初始化向量與INTS
- 3. 將int初始化爲0還是不?
- 4. C中的全局變量是否始終初始化爲零?
- 5. 結構初始化爲0
- 6. UNIX初始化進程是否始終運行
- 7. 初始化對象時,實例變量始終未初始化?
- 8. iPhone:textViewdDidBeginEditing:textview.tag始終爲0
- 9. NSTimeInterval始終爲0
- 10. getHistorySize()始終爲「0」
- 11. Readystate始終爲0
- 12. DataGrid.Columns.Count始終爲0
- 13. navigator.connection.type始終爲0
- 14. indexPath.row始終爲0
- 15. resultCode始終爲0
- 16. PerformaceCounter始終爲0
- 17. FREETEXTTABLE始終爲0
- 18. LLVM是否爲初始類型初始化局部變量?
- 19. JMockit是否初始化EJB?
- 20. 非顯式初始化成員在其成員初始化的結構中始終爲0?
- 21. c struct的成員是否保證被初始化爲0?
- 22. Objective-C中的int是否自動初始化爲0?
- 23. Javascript類型的數組是否已初始化爲0?
- 24. 爲什麼變量初始化爲0?
- 25. 初始化類具有{0}
- 26. 初始化變量的初始化是否正確?
- 27. C++ 11是否重新初始化初始化成員字段?
- 28. 重新初始化或檢查菜單是否被初始化
- 29. Java和最終初始化
- 30. 最終變量初始化
現貨。然而,人們經常對這個細節感到疑惑的事實足以使變量初始化更明確,可以說是「更安全」的選擇。初始化爲0/nil/NULL從不傷害任何人...... :-) – 2009-06-13 16:36:30