iOS 开发技巧大全

深入剖析OC Runtime(二)-self super

2016-07-19  本文已影响48人  ShawnDu

先上题目

Child.h:

#import "Father.h"
@interface Child : Father
- (void)test;
@end

Child.m:

#import "Child.h"
@implementation Child
- (id)init {
    self = [super init];
    if (self) {
        NSLog(@"%@", NSStringFromClass([self class]));
        NSLog(@"%@", NSStringFromClass([super class]));
        [self test];
        [super test];
    }
    return self;
}

- (void)test {
    NSLog(@"Child class");
}

Father.h:

@interface Father : NSObject

- (void)test;
@end

Father.m:

#import "Father.h"

@implementation Father

- (void)test {
    NSLog(@"Father class");
}
@end

在main.m里面实例化child:

 Child *child = [Child new];

输出结果

**2016-07-19 14:46:15.963 RuntimeDemo[25081:446761] Child**
**2016-07-19 14:46:15.965 RuntimeDemo[25081:446761] Child**
**2016-07-19 14:46:15.966 RuntimeDemo[25081:446761] Child class**
**2016-07-19 14:46:15.966 RuntimeDemo[25081:446761] Father class**

解析

self 是类的隐藏参数,指向当前调用方法的这个类的实例。而 super 是一个 Magic Keyword, 它本质是一个编译器标示符,和 self 是指向的同一个消息接受者。上面的例子不管
调用[self class]还是[super class],接受消息的对象都是当前 Child这个对象。

当使用 self 调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找;而当使用 super 时,则从父类的方法列表中开始找,然后调用父类的这个方法。

-调用[self class]时,从child当前类中找class方法,找不到,再依次向父类,最后找
到NSObject类中有class方法:

- (Class)class {
    return object_getClass(self);
}

微信公众号

开发者思维 devthinking

QQ交流群:295976280

iOS交流群(一)群二维码.png
上一篇下一篇

猜你喜欢

热点阅读