我正在尋找一種方法使NSInvocation
調用特定的IMP
。默認情況下,它會調用它可以找到的「最低」IMP
(即,最近被覆蓋的版本),但是我正在尋找一種方法來使其從繼承鏈中較高的位置調用IMP
。我想要調用的IMP
是動態確定的,否則我可以使用super
關鍵字或類似的東西。使NSInvocation調用特定的IMP
我的想法是使用-forwardInvocation:
機制來捕獲消息(簡單和已經工作的),然後改變IMP
如此這般以既不是super
執行也不是最遠的後裔的實現方法。 (硬)
我發現遠程關閉的唯一東西是AspectObjectiveC,但這需要libffi,這使得它與iOS不兼容。理想情況下,我希望這是跨平臺的。
任何想法?
免責聲明:我只是嘗試
嘗試了蹦牀功能
所以我想我已經得到的東西大多是成立的@ bbum的想法;我有以下蹦牀是被通過class_addMethod()
正確添加,並且它得到進入:
id dd_trampolineFunction(id self, SEL _cmd, ...) {
IMP imp = [self retrieveTheProperIMP];
self = [self retrieveTheProperSelfObject];
asm(
"jmp %0\n"
:
: "r" (imp)
);
return nil; //to shut up the compiler
}
我已經驗證了,無論是適當的自我,並正確IMP是前JMP正確的事情,並_cmd
參數也正常進入。 (換句話說,我正確地添加了這個方法)。
但是,事情正在發生。我有時會發現自己跳到一種方法(通常不是正確的方法),其中無self
和_cmd
。其他時候,我只會在EXC_BAD_ACCESS的途中崩潰。想法? (自從我在彙編中完成任何事情之後已經很長時間了......)我正在x86_64上測試它。
+1一個非常有趣的想法。不幸的是,如果目標'IMP'調用任何其他方法,他們會轉到與目標'IMP'相同級別的版本,而不是最遠的後代。 – 2011-02-19 06:47:04
更不用說,如果你以這樣的方式離開課堂,就會被同時併發的任何併發的破壞...(但是,我喜歡它!:) – bbum 2011-02-19 07:35:14