Objective-C中的self和super理解

1,882 阅读1分钟
@implementation xxx : NSObject
- (id)init {
    self = [super init];
    if (self) {
    }
    return self;
}

1、self是一个隐藏参数变量

self是一个隐藏参数变量,指向当前调用方法的对象,还有一个隐藏参数是_cmd,代表当前方法selector。在runtime时会调用objc_msgSend()方法。

2、super是预编译指令

super并不是隐藏参数,只是编译器的指令符号,在runtime时调用objc_msgSendSuper()方法。

当使用 super 调用时,运行时会使用 objc_msgSendSuper 函数:

id objc_msgSendSuper(struct objc_super *super, SEL op, ...)

objc_super的结构体如下:

struct objc_super {
id receiver;
Class superClass;
};

当编译器遇到 [super xxxx:] 时,开始做下面几个事:

1)构建objc_super的结构体,receiver就是子类,和 self 中相同。
superClass就是父类调用 objc_msgSendSuper 的方法,将这个结构体和xxxx的selector传递过去。

2)从objc_super结构体指向的superClass的方法列表开始找 xxxx的selector,
找到后再用objc_super->receiver去调用这个selector。

知道self和super的原理就会很容易明白为什么[self class]和[super class]输出结果会是一样的。

[super init]去self的super中调用init, 然后super会调用其父类的init,以此类推,直到找到根类NSObject中的init。 然后根类中的init负责初始化内存区域,添加一些必要的属性,返回内存指针,延着继承链,指针从上到下进行传递,同时在不同的子类中可以向内存添加必要的属性。 最后当前类中把内存地址赋值给self参数。