OC的事件傳遞會從子類開始尋址,如果沒有找到事件,則向它的父類找,還沒找到,則會向父類的父類找,一直找到NSObject.
而眾所周知,調用父類方法需要用到super關鍵字.當我們知道的一個對象包含有一個私有方法時,如果需要改寫它的私有方法,那么我們就需要調用到父類的方法super關鍵字.但是此時調用super,Xcode會發脾氣啦~"父類找不到這個方法!"
此時如果我們想調用父類的方法就需要一定手段啦!
進入頭文件#import <objc/message.h>查看,平時用到的函數
id objc_msgSend(id self, SEL op, ...)
下方有另外一個函數
id objc_msgSendSuper(struct objc_super *super, SEL op, ...)
那么線索來了,這個函數該怎么用呢?
平日里我們都是用的self,此時多出一個結構體struct objc_super *super
點進去發現,原來結構體是這樣介紹的:
struct objc_super {
? /// 指定一個現有的對象.
? __unsafe_unretained id receiver;
? /// 指定上面的對象的父類.
? #if !defined(__cplusplus)? &&? !__OBJC2__ //如果未定義OC2.0和C++,則定義它
? /* 舊款的runtime,我們可以忽略不計 */
? __unsafe_unretained Class class;
? #else
? //新款的class,需要賦值該對象的父類
? __unsafe_unretained Class super_class;
? #endif
? /* super_class is the first class to search */
};
好了,那么我們就開始手動將super關鍵字實現一下吧!當想手動調用UIViewController的super時需要以下幾步:
//定義一個結構體
struct objc_super superclass = {self,self.superclass};
此時,superclass就是我們想要的啦!
如果我們想調用[super viewDidLoad]呢?
代碼如下:
((void(*)(struct objc_super *,SEL))objc_msgSendSuper)(&superclass,@selector(viewDidLoad));
*號使用取地址符號即可
那么帶參數呢?繼續強轉向后面拼接參數就可以啦~
------------------------------我 是 有 底 線 的------------------------------