2009-04-25 36 views
2

在可能的情況下使用id或NSSomeObject *是否更好?我知道編譯器可以更好地檢查什麼時候是明確的,但我只是想知道哪種更好。(id)與(NSSomeObject *)?

例如爲:

- (IBAction)someButton:(id)sender 

- (IBAction)someButton:(NSButton *)sender. 

是否有到這類的任何好處?

回答

1

如果使用- (IBAction)someButton:(id)sender,你可以有一個NSNotification或其他事件調用這是一個選擇。而在第二種情況下,只有NSButton *將能夠使用此方法。

至於是否允許多個對象類型調用一個動作是一個很好的做法,我還不能肯定。但我使用它,因爲我可以編寫和調試較少的代碼。

+0

不正確。如果您將聲明保留爲NSButton *,則編譯器會警告您是否嘗試傳遞其他類型的對象實例,但由於Objective-C方法遲到,任何響應適當選擇器(方法)的對象都會起作用在運行時。 – 2009-04-26 17:07:18

+0

你不需要實際上將自己作爲IBAction的參數傳遞 - 這只是一個普通的論點。哎呀,在大多數情況下,無論如何,您都可以將nil作爲發件人。 – Chuck 2009-04-26 17:29:12

1

我喜歡用特定的類。

的Objective-C並不強制你寫的正確類型怎麼一回事,因爲它是一個動態語言,但是編譯器可以警告你一些明顯的錯誤。

此外,從目標C 2.0性質不與id類型工作。


在你與IBAction具體的例子我會使用id,因爲一個動作應該是可調用從任何東西,不僅從按鈕。

1

我知道的編譯器可以做的更好 檢查時,它的明確的,但我 只是想知道這是更好的做法 。

顯式鍵入(=指定對象的精確類型)是您的朋友。當編譯器可以做更好的檢查時,它會爲你捕獲更多的錯誤。只有當您發現自己被明確的打字限制時,才使用id類型(= duck typing)。

1

它是使用最明確的類型可以明確,這樣編譯器可以幫助您捕捉最基本的錯誤,最好的做法。但是,您獲得的安全性非常小。更重要的是,您有足夠的單元測試來捕獲更高級別的錯誤,這會導致您將意外的實例類型傳遞給方法。