super 方法呼叫

2021-10-06 14:35:23 字數 1401 閱讀 8703

1

我們是通過[super somemethod]來呼叫父類方法的。在呼叫的父類方法中,self還是子類的物件。也可以通過objc_msgsendsuper這種方式來呼叫父類方法,傳入乙個struct objc_super 結構體引數。

objc_msgsendsuper2和objc_msgsendsuper

前者是私用的,只能由系統轉化,即將[super somemethod]轉化為objc_msgsendsuper2。後者是公開的,可以手動呼叫。

2引數有所不同

手動呼叫[super method]時,系統生成的彙編**中,rdi是乙個位址,存放著receiver和class,這個class就是receiver的isa。即[receiver class]或object_getclass(receiver)。

0x7fff67bea280 <+0>:   movq   0x8(%rdi), %r10

0x7fff67bea284 <+4>: movq (%rdi), %rdi

0x7fff67bea287 <+7>: movq 0x8(%r10), %r10

在_objc_msgsendsuper2內部中,1、是取出rdi+8處存放的內容,即receiver的isa。2、是取出rdi處存放的內容賦值給rdi,即receiver。3、再獲取這個isa的superclass,然後進行方法查詢。

手動呼叫_objc_msgsendsuper時,先構建struct objc_super 結構體引數

struct objc_super superclazz =

;void (*objc_msgsendsupercasted)(void *, sel, id) = (void *)objc_msgsendsuper;

objc_msgsendsupercasted(&superclazz, @selector(somemethod), nil);

引數的super_class是receiver的isa的superclass,呼叫時將結構體引數的位址傳過去的,這點objc_msgsendsuper2類似。

0x7fff67bea200 <+0>:   movq   0x8(%rdi), %r10

0x7fff67bea204 <+4>: movq (%rdi), %rdi

在objc_msgsendsuper內部,1、取出rdi+8處存放的內容,2、是取出rdi處存放的內容賦值給rdi,即receiver,然後進行查詢的。少了乙個獲取isa的superclass步驟,所以結構體中的super_class 要賦值為class_getsuperclass(object_getclass(receiver))。

3objc_msgsend中是先獲得receiver的isa,然後再進行查詢的。

super 呼叫父類方法

詳解python的super 的作用和原理 python 中物件的定義很怪異,第乙個引數一般都命名為self,用於傳遞物件本本身,而在呼叫的時候則不必顯示傳遞,系統會自動傳遞 今天我們介紹的主角是super 在類的繼承裡面super 非常常用,它解決了子類呼叫父類方法的一些問題,父類多次被呼叫只執行...

Python呼叫父類方法之super()

super 方法的語法 super type object or type super 是用來解決多重繼承問題的,直接用類名呼叫父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查詢順序 mro 重複呼叫 鑽石繼承 等種種問題。在super方法中包含了cj演算法 確保每個類被呼叫一次 具...

super關鍵字呼叫 「父類無參」 方法

1 子類繼承父類時,子類構造方法第一行系統會自動預設編寫super 在呼叫子類的構造方法時,先呼叫父類的無引數構造方法。2 如果父類中沒有 無引數的構造方法,那子類繼承父類時就會報錯,因子類的構造方法在預設呼叫父類無引數構造方法super 不存在。這時我們解決方式是 通過手動在子類中編寫呼叫父類有引...