通过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

你可能感兴趣的:(通过objc_msgSend 理解Objective-C 中的self和super)