概念
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