深入剖析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);
}
- 调用[super class]时,从Father当前类中找class方法,找不到,再找NSObject类中有class方法;
- [self test]方法,直接调用当前Child类中的test方法;
- [super test]方法,调用父类中的test方法。