runtime事件傳遞之super的手動內部實現

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));

*號使用取地址符號即可

那么帶參數呢?繼續強轉向后面拼接參數就可以啦~


------------------------------我 是 有 底 線 的------------------------------

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,788評論 0 9
  • 我們常常會聽說 Objective-C 是一門動態語言,那么這個「動態」表現在哪呢?我想最主要的表現就是 Obje...
    Ethan_Struggle閱讀 2,232評論 0 7
  • runtime 運行時語言,實現Object-C的C語言庫,將OC轉換成C進行編譯的過渡者。 作為一門動態編程語言...
    夜雨聲煩_閱讀 558評論 0 0
  • 前情回顧 張曉蘭深深的把頭低了下去,臉紅的很。 她不敢抬眼去看李羽軒成的臉,頭低的更低了。手突然撤了回來。 是的,...
    挪威陽光閱讀 666評論 0 1
  • 歐墅依山勢恢宏, 溢彩流光人潮涌。 池水靜臥蓮依葉, 駐足憑欄去何從?
    劍飛雪閱讀 204評論 0 2