2010-08-15 18 views

回答

3

我向你介紹了三種可能的方法來做到這一點+(void)load。在任何情況下,請將您的方法命名爲MyCategory_method。

  • class_getMethodImplementation()和class_replaceMethod()。存儲舊的IMP,並直接調用它。您需要獲取方法的類型編碼。請注意,您也可以使用正常的C函數...
  • class_getInstanceMethod(),method_getImplementation(),method_setImplementation()。如上所述,但您不需要獲取方法的類型編碼。
  • 兩個方法上都有class_getInstanceMethod(),然後是method_exchangeImplementations()。調用MyCategory_method以獲取原始實現。這是最簡單的方法。

有時候,這是唯一合理的簡單的方法來讓它做你想要的...

編輯:也只有這樣做,如果你知道你在做什麼!

+0

嗯,我想這回答我的問題,不幸;)認真,謝謝你的幫助! – BeachRunnerFred 2010-08-16 18:11:11

3

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocCategories.html

看起來不像是可能的。

當一個類別重寫一個繼承的方法時,類別中的方法可以像往常一樣通過消息調用繼承的實現super。但是,如果某個類別覆蓋了該類別中已有的方法,則無法調用原始實現。

這對我說的是,如果您通過類別覆蓋子類上的方法,您可以像往常一樣調用[super methodName],但是如果直接覆蓋基類方法,則不能調用原件。

+1

這是可能的,但不是沒有攪拌。但是,不要這樣做。最終,它會導致比解決問題更多的問題。 – bbum 2010-08-15 15:06:00

0

如果您動態提供類別覆蓋(請參閱resolveInstanceMethod :),則可以事先緩存上一個方法選擇器,然後調用它。

相關問題