根據Apple的Objective C指南,具有相同名稱的方法都使用相同的選擇器,並且它們需要具有相同的返回類型以及參數。有關動態綁定,Objective C和方法的問題
然後有一些關於「靜態類型」的方法是例外。
所以它是具有相同名稱和返回類型+參數共享選擇器,但如果它只是相同的名稱,但不同的返回類型和/或參數,它將有一個不同的選擇器 - 如果你發送了這樣的信息給它...好吧,我不知道。
根據Apple的Objective C指南,具有相同名稱的方法都使用相同的選擇器,並且它們需要具有相同的返回類型以及參數。有關動態綁定,Objective C和方法的問題
然後有一些關於「靜態類型」的方法是例外。
所以它是具有相同名稱和返回類型+參數共享選擇器,但如果它只是相同的名稱,但不同的返回類型和/或參數,它將有一個不同的選擇器 - 如果你發送了這樣的信息給它...好吧,我不知道。
選擇器代表方法名稱,而不是方法簽名。在下面的例子:
- (void)someMethod:(int)intParam;
- (id)someMethod:(float)floatParam;
兩種方法具有相同的名稱(someMethod:
),因此,相同的選擇:@selector(someMethod:)
。
假設您已聲明名爲Foo
的類中的第一個方法以及名爲Bar
的類中的第二個方法。然後:
Foo *foo = …;
Bar *bar = …;
[foo someMethod:42];
[bar someMethod:3.1416f];
是「靜態類型化」的方法調用的例子,因爲它清楚應該使用的方法,因爲foo
和bar
都是靜態類型的編譯器。
現在考慮以下幾點:
id foobar = …;
[foobar someMethod:42];
由於foobar
具有類型id
,這是通用的Objective-C的對象類型,編譯器沒有足夠的信息來決定被調用哪個方法。它會選擇這兩種方法中的一種,根據返回類型和參數類型之間的差異,這可能很危險。這就是爲什麼Apple建議具有相同名稱的方法也應該具有相同的簽名。 Matt Gallagher寫了一篇關於the pitfalls of weak typing in Objective-C的博客文章。
啊...謝謝。謝謝。只需要小心'id'類型的變量,那麼避免將兩個方法命名爲相同的名稱,如果它們不是「相關的」並且具有相同的簽名。 PS:我真的應該註冊,所以我可以投票。 – AndIWonder
@And如果這些方法具有相同的簽名,則不是問題。如果這些方法具有相同的名稱,但具有_different_簽名,則可能會出現問題。即使你沒有將變量聲明爲'id',也有幾種框架方法的返回類型是'id',所以你可能會遇到麻煩而不會注意到它。 – 2011-07-07 10:08:25
感謝您的警告。來自Java的地方,編譯器會盡其所能地阻止你在腳下射擊。這裏的寬鬆打字有點文化衝擊。 LOL – AndIWonder