回答
在您的示例中代碼的主要問題是,在某些情況下,-init方法返回的對象與您使用+ ALLOC。如果發生了這種情況,那麼你的代碼將是不正確的,因爲你沒有將[c init]
的結果分配給c,並且你最終會使用錯誤的對象(以及沒有正確初始化的對象)。這就是爲什麼標準習慣用法總是將+ alloc和-init合併在同一行:
id c = [[Person alloc] init];
現在,您可能已經編寫了Person類並擁有第一手知識--init總是返回相同的對象,但我不應該非常熟悉Person的內部工作來讀取您的代碼並擁有一個感覺它是否正確。你的代碼是「更好的」,因爲如果你遵循慣例,任何人都可以說它正在做正確的事情。
我認爲將c聲明爲id類型並不可怕,但在這種情況下確實看起來很愚蠢。您知道知道 c將是Person *類型,那麼爲什麼要將它聲明爲id並丟棄編譯器可用來幫助您編寫更好代碼的有用信息?如果有充分的理由使用id,那很好,但如果你可以更加具體地說明你應該這樣做。
當使用id
泛型類型,你不會得到你一個警告嘗試調用一個不存在的方法。編譯器假定你知道你在做什麼。
否則,我不能想到的問題。這在很多情況下很常見(請考慮快速枚舉異構容器類型)
+1簡潔,正確的答案。 – Caleb
另一個潛在的危險是,隨着時間的推移,可能會添加意外不僅用於初始化某些情況下...留下分配,但從來沒有初始化的對象邏輯單元中的所有值都基本上是隨機的任何設置代碼是意味着做不完成。
- 1. 爲什麼建議統一初始化(使用大括號初始化)?
- 2. 爲什麼不使用NSObject而初始化代替ID
- 3. 爲什麼分配或初始化NSDateFormatter被視爲「昂貴」?
- 4. 建議初始Emacs配置?
- 5. 分配初始化
- 6. 分配/初始化
- 7. 爲什麼不初始化std :: vector <T>初始化T?
- 8. 用=初始化和用{}初始化有什麼區別?
- 9. 爲什麼初始化
- 10. 爲什麼malloc()初始化新分配的內存塊的值?
- 11. 爲什麼.net在初始化2d數組時分配內存?
- 12. 客觀C什麼時候分配和初始化澄清
- 13. 什麼時候分配和初始化變量?
- 14. 爲什麼NSFetchRequest不能初始化?
- 15. Allegro爲什麼不初始化?
- 16. 爲什麼Hibernate不初始化數據?
- 17. 爲什麼不能Indy 10初始化?
- 18. 爲什麼Date.new不會初始化?
- 19. 爲什麼不能爲std :: tuple分配一個初始化列表?
- 20. ActiveRecord的:初始化ID爲
- 21. 爲什麼我無法使用列表初始化初始化std :: vector
- 22. 分配未初始化片
- 23. 結構初始化/分配
- 24. 聲明/初始化和內存分配
- 25. xCode 4.6對象分配和初始化
- 26. 字符串分配和初始化
- 27. 初始化和分配無弧?
- 28. 爲什麼我無法單獨創建和初始化OpenGl VAO?
- 29. Sencha Touch 2 - 什麼是初始化和初始化?
- 30. 爲什麼不需要使用「新」來初始化std :: vector?
+1發現潛在的-init bug :) – Eiko