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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容