理解 Self & Super

2018-03-28  本文已影响20人  geekAppke

下面会打印什么?

- (id)init {
    self = [super init];
    if (self)
    {
        NSLog(@"%@", NSStringFromClass([self class]));
        NSLog(@"%@", NSStringFromClass([super class]));
    }
    return self;
 }
 @end
self:当前这个对象
super:编译器标示符,给编译器看的,底层用另外一个方法发消息
super就是self,去调用父类方法
让当前对象调用父类方法,本质上还是self在调用

深度解析

调用[self class]方法时

NSObject类中- (Class)class的实现如下:
- (Class)class {
    // 返回实例的isa指针指向的类
    return object_getClass(self);
} 

[self class] == objc_msgSend(self, "class");
打印:Son

调用[super class]方法时

转化为objc_msgSendSuper,函数定义如下:
id objc_msgSendSuper(struct objc_super *super, SEL op, ...) 
// objc_super的结构体
struct objc_super {
    id receiver;     
    Class super_class; // 记录当前父类
}; 
[super class]转换流程

[super class] → objc_msgSendSuper(objc_super{self, superclass}, sel_registerName("class")) → objc_msgSend(objc_super->self, sel_registerName("class")) === [self class]
打印:Son


demo2:理解super

@implementation Father
- (void)test
{
    NSLog(@"%@, %@, %@", [self class], [self superclass], [super class]);
}
@end
--------------------------------
@implementation Son

/**
  class:获取方法调用者类名
  superclass:获取方法调用者的父类类名
  super:指向父类的标识,编译器修饰符,不是指针
 */
- (void)test
{
    // 谁调用这个方法,self就是谁!
    NSLog(@"%@", self);
//    NSLog(@"%@", super);
    // 函数里也没有定义super
    // self是隐藏参数,super就是个标识符,和const差不多!
//    NSLog(@"%@, %@, %@", [self class], [self superclass], [super class]);
    // Son, Father, Son
    
    [super test];
    // Son, Father, Son
}
@end
super不是父类对象!!

参考资料

上一篇 下一篇

猜你喜欢

热点阅读