美文网首页
通过objc_msgSend 理解Objective-C 中的s

通过objc_msgSend 理解Objective-C 中的s

作者: HearnWING | 来源:发表于2017-02-22 00:10 被阅读54次

    概念

    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 中的s

          本文链接:https://www.haomeiwen.com/subject/lwhpwttx.html