調用 objc_msgSendSuper 的方法,將這個結構體和 setName 的 sel 傳遞過去。函數里面在做的事情類似這樣:從 objc_super 結構體指向的 superClass 的方法列表開始找 setName 的 selector,找到后再以 objc_super->receiver 去調用這個 selector,可能也會使用 objc_msgSend 這個函數,不過此時的第一個參數 theReceiver 就是 objc_super->receiver,第二個參數是從 objc_super->superClass 中找到的 selector
里面的調用機制大體就是這樣了,以上面的分析,回過頭來看開始的代碼,當輸出 [self class] 和 [super class] 時,是個怎樣的過程。
當使用 [self class] 時,這時的 self 是 PersonMe,在使用 objc_msgSend 時,第一個參數是 receiver 也就是 self,也是 PersonMe* me 這個實例。第二個參數,要先找到 class 這個方法的 selector,先從 PersonMe 這個類開始找,沒有,然后到 PersonMe 的父類 Person 中去找,也沒有,再去 Person 的父類 NSObject 去找,一層一層向上找之后,在 NSObject 的類中發現這個 class 方法,而 NSObject 的這個 class 方法,就是返回 receiver 的類別,所以這里輸出 PersonMe。
當使用 [super class] 時,這時要轉換成 objc_msgSendSuper 的方法。先構造 objc_super 的結構體吧,第一個成員變量就是 self,第二個成員變量是 Person,然后要找 class 這個 selector,先去 superClass 也就是 Person 中去找,沒有,然后去 Person 的父類中去找,結果還是在 NSObject 中找到了。然后內部使用函數 objc_msgSend(objc_super->receiver, @selector(class)) 去調用,此時已經和我們用 [self class] 調用時相同了,此時的 receiver 還是 PersonMe* me,所以這里返回的也是 PersonMe。