概念
self:實(shí)例方法中指代實(shí)例對(duì)象,由運(yùn)行時(shí)決定疫粥;在類(lèi)方法中指代該類(lèi)肋联。
super:指代方法所在類(lèi)的父類(lèi)。
調(diào)用方法的過(guò)程
- 先找方法
- 執(zhí)行方法
如 [a say]
實(shí)際是 objc_msgSend(a, @selector(say))
因此會(huì)在a的繼承鏈中尋找say方法,然后再a傳遞過(guò)去。而如果是super調(diào)用扣溺,那么在編譯時(shí)便已經(jīng)確定查找方法的起點(diǎn)轮傍,即把定義所在類(lèi)的父類(lèi)作為尋找方法的起點(diǎn)。也就是我們平常所理解的調(diào)用父類(lèi)的方法岩榆,找個(gè)父類(lèi)是編譯時(shí)決定的,而不是運(yùn)行時(shí)。
實(shí)例
@implementation Son : Father
- (id)init
{
self = [super init];
if (self) {
NSLog(@"%@", NSStringFromClass([self class]));
NSLog(@"%@", NSStringFromClass([super class]));
}
return self;
}
@end
打印的都是 Son失乾,因?yàn)?objc_msgSend(id self, SEL cmd)
中的self是同一個(gè)。
另外一個(gè)有趣的實(shí)例在這里
Objective C: Difference between self and super