概念
self:實例方法中指代實例對象,由運行時決定;在類方法中指代該類。
super:指代方法所在類的父類。
調用方法的過程
- 先找方法
- 執行方法
如 [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