2011-07-07 55 views
0

根據Apple的Objective C指南,具有相同名稱的方法都使用相同的選擇器,並且它們需要具有相同的返回類型以及參數。有關動態綁定,Objective C和方法的問題

然後有一些關於「靜態類型」的方法是例外。

所以它是具有相同名稱和返回類型+參數共享選擇器,但如果它只是相同的名稱,但不同的返回類型和/或參數,它將有一個不同的選擇器 - 如果你發送了這樣的信息給它...好吧,我不知道。

回答

6

選擇器代表方法名稱,而不是方法簽名。在下面的例子:

- (void)someMethod:(int)intParam; 
- (id)someMethod:(float)floatParam; 

兩種方法具有相同的名稱(someMethod:),因此,相同的選擇:@selector(someMethod:)

假設您已聲明名爲Foo的類中的第一個方法以及名爲Bar的類中的第二個方法。然後:

Foo *foo = …; 
Bar *bar = …; 

[foo someMethod:42]; 
[bar someMethod:3.1416f]; 

是「靜態類型化」的方法調用的例子,因爲它清楚應該使用的方法,因爲foobar都是靜態類型的編譯器。

現在考慮以下幾點:

id foobar = …; 

[foobar someMethod:42]; 

由於foobar具有類型id,這是通用的Objective-C的對象類型,編譯器沒有足夠的信息來決定被調用哪個方法。它會選擇這兩種方法中的一種,根據返回類型和參數類型之間的差異,這可能很危險。這就是爲什麼Apple建議具有相同名稱的方法也應該具有相同的簽名。 Matt Gallagher寫了一篇關於the pitfalls of weak typing in Objective-C的博客文章。

+0

啊...謝謝。謝謝。只需要小心'id'類型的變量,那麼避免將兩個方法命名爲相同的名稱,如果它們不是「相關的」並且具有相同的簽名。 PS:我真的應該註冊,所以我可以投票。 – AndIWonder

+0

@And如果這些方法具有相同的簽名,則不是問題。如果這些方法具有相同的名稱,但具有_different_簽名,則可能會出現問題。即使你沒有將變量聲明爲'id',也有幾種框架方法的返回類型是'id',所以你可能會遇到麻煩而不會注意到它。 – 2011-07-07 10:08:25

+0

感謝您的警告。來自Java的地方,編譯器會盡其所能地阻止你在腳下射擊。這裏的寬鬆打字有點文化衝擊。 LOL – AndIWonder