在可能的情況下使用id或NSSomeObject *是否更好?我知道編譯器可以更好地檢查什麼時候是明確的,但我只是想知道哪種更好。(id)與(NSSomeObject *)?
例如爲:
- (IBAction)someButton:(id)sender
與
- (IBAction)someButton:(NSButton *)sender.
是否有到這類的任何好處?
在可能的情況下使用id或NSSomeObject *是否更好?我知道編譯器可以更好地檢查什麼時候是明確的,但我只是想知道哪種更好。(id)與(NSSomeObject *)?
例如爲:
- (IBAction)someButton:(id)sender
與
- (IBAction)someButton:(NSButton *)sender.
是否有到這類的任何好處?
如果使用- (IBAction)someButton:(id)sender
,你可以有一個NSNotification
或其他事件調用這是一個選擇。而在第二種情況下,只有NSButton *
將能夠使用此方法。
至於是否允許多個對象類型調用一個動作是一個很好的做法,我還不能肯定。但我使用它,因爲我可以編寫和調試較少的代碼。
我喜歡用特定的類。
的Objective-C並不強制你寫的正確類型怎麼一回事,因爲它是一個動態語言,但是編譯器可以警告你一些明顯的錯誤。
此外,從目標C 2.0性質不與id
類型工作。
在你與IBAction
具體的例子我會使用id
,因爲一個動作應該是可調用從任何東西,不僅從按鈕。
我知道的編譯器可以做的更好 檢查時,它的明確的,但我 只是想知道這是更好的做法 。
顯式鍵入(=指定對象的精確類型)是您的朋友。當編譯器可以做更好的檢查時,它會爲你捕獲更多的錯誤。只有當您發現自己被明確的打字限制時,才使用id
類型(= duck typing)。
它是使用最明確的類型可以明確,這樣編譯器可以幫助您捕捉最基本的錯誤,最好的做法。但是,您獲得的安全性非常小。更重要的是,您有足夠的單元測試來捕獲更高級別的錯誤,這會導致您將意外的實例類型傳遞給方法。
不正確。如果您將聲明保留爲NSButton *,則編譯器會警告您是否嘗試傳遞其他類型的對象實例,但由於Objective-C方法遲到,任何響應適當選擇器(方法)的對象都會起作用在運行時。 – 2009-04-26 17:07:18
你不需要實際上將自己作爲IBAction的參數傳遞 - 這只是一個普通的論點。哎呀,在大多數情況下,無論如何,您都可以將nil作爲發件人。 – Chuck 2009-04-26 17:29:12