Objective-C中的self和super理解

@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参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值