2011-06-08 28 views
4

我已將類0123k添加到類Category1中的類MYCustomClass,該類別與原始類的定義分開。然後我在另一個類別Category2中增加了另一種方法foo。然後在MYCustomClass的實例上調用foo。在我的情況下,正在調用Category2中的foo。我的問題是:這有什麼解釋嗎?或者,它是那些「未定義」/「編譯器相關」行爲之一。另外,是否可以通過指定我想在呼叫中使用的類別來限定方法調用來處理這種情況。在目標C類中使用類別添加衝突的方法

編輯:我知道我在做什麼不被支持。如果周圍有黑客攻擊,我只是感興趣。

回答

3

當一個類被加載時,它的方法被插入到現有的方法表中,並且在完成後無法區分它們來自哪裏。最後一個加載類別勝出。回到NeXTSTEP的日子裏,我們有時會故意將其作爲一種非常奇怪的方式來修復我們沒有源代碼的破解方法。

3

這是未定義的行爲。從Objective-C Programming Language文檔:

類別不能可靠地覆蓋在同一類的另一個類別中聲明的方法。

這個問題特別重要,因爲許多Cocoa類都是使用類別實現的。您嘗試覆蓋的框架定義方法本身可能已在類別中實現,因此沒有定義哪個實現優先。

不,你不能指定你想要Category1foo,或Category2foo。如果你需要這個,你應該爲這些方法提供不同的名稱,例如foo1foo2