2011-07-16 36 views

回答

14

在您的示例中代碼的主要問題是,在某些情況下,-init方法返回的對象與您使用+ ALLOC。如果發生了這種情況,那麼你的代碼將是不正確的,因爲你沒有將[c init]的結果分配給c,並且你最終會使用錯誤的對象(以及沒有正確初始化的對象)。這就是爲什麼標準習慣用法總是將+ alloc和-init合併在同一行:

id c = [[Person alloc] init];

現在,您可能已經編寫了Person類並擁有第一手知識--init總是返回相同的對象,但我不應該非常熟悉Person的內部工作來讀取您的代碼並擁有一個感覺它是否正確。你的代碼是「更好的」,因爲如果你遵循慣例,任何人都可以說它正在做正確的事情。

我認爲將c聲明爲id類型並不可怕,但在這種情況下確實看起來很愚蠢。您知道知道 c將是Person *類型,那麼爲什麼要將它聲明爲id並丟棄編譯器可用來幫助您編寫更好代碼的有用信息?如果有充分的理由使用id,那很好,但如果你可以更加具體地說明你應該這樣做。

+1

+1發現潛在的-init bug :) – Eiko

-1

首先,類型鑄造問題。每次你想使用'c'時,你可能需要(Person *),即對它進行類型轉換。

其次,如果你有個人聲明的任何方法,你不能把它作爲[c aMthod]風格,你必須使用,[(Person *) c aMethod].

+1

你不需要第二組括號('[(Person *)c method]') – indragie

+2

雖然你幾乎不需要輸入任何類型的id。 – Eiko

4

當使用id泛型類型,你不會得到你一個警告嘗試調用一個不存在的方法。編譯器假定你知道你在做什麼。

否則,我不能想到的問題。這在很多情況下很常見(請考慮快速枚舉異構容器類型)

+0

+1簡潔,正確的答案。 – Caleb

2

另一個潛在的危險是,隨着時間的推移,可能會添加意外不僅用於初始化某些情況下...留下分配,但從來沒有初始化的對象邏輯單元中的所有值都基本上是隨機的任何設置代碼是意味着做不完成。