通過objc_msgSend 理解Objective-C 中的self和super

概念

self:實例方法中指代實例對象,由運行時決定;在類方法中指代該類。
super:指代方法所在類的父類。

調用方法的過程

  1. 先找方法
  2. 執行方法

[a say] 實際是 objc_msgSend(a, @selector(say))
因此會在a的繼承鏈中尋找say方法,然后再a傳遞過去。而如果是super調用,那么在編譯時便已經確定查找方法的起點,即把定義所在類的父類作為尋找方法的起點。也就是我們平常所理解的調用父類的方法,找個父類是編譯時決定的,而不是運行時。

實例

@implementation Son : Father
- (id)init
{
    self = [super init];
    if (self) {
        NSLog(@"%@", NSStringFromClass([self class]));
        NSLog(@"%@", NSStringFromClass([super class]));
    }
    return self;
}
@end

打印的都是 Son,因為 objc_msgSend(id self, SEL cmd) 中的self是同一個。

另外一個有趣的實例在這里
Objective C: Difference between self and super

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

推薦閱讀更多精彩內容