Self关键字代表什么
在实例方法中Self指代本类的实例对象。
在类方法中Self指代类对象
为什么可以在方法中使用self
这里涉及到好几个runtime的知识点
类方法和实例方法
实例方法存储在类对象class结构中,类方法存储在元类中,实例方法只能由实例对象去调用,而类方法只能由类对象去调用
一个方法的调用其实是给一个对象发送消息
id objc_msgSend ( id self, SEL op, ... );
当objc_msgSend找到方法对应的实现时,它将直接调用该方法实现,并将消息中所有的参数都传递给方法实现,同时,它还将传递两个隐藏的参数:
接收消息的对象(也就是self指向的内容)
方法选择器(_cmd指向的内容)
一个方法的实现代码在运行时会转换成C++代码,会传入参数消息接受者id self 和方法名。
因此当方法的调用者为实例对象时,传入的为实例对象(self指向实例对象);当方法的调用者为类对象时,传入的为类对象(self指向类对象)。
这也是为什么实例方法中self指向实例对象,而类方法中self指向类对象
self是指向本类的指针,是类的隐藏参数,指向当前调用方法的对象(类对象或者实例对象)
通过self,可以在方法实现中访问消息接收者对象的实例变量。
self = [super init];
如果是[super init]的话,super会调用其父类的init,以此类推,直到找到根类NSObject中的init。然后根类中的init负责初始化内存区域,添加一些必要的属性,返回内存指针,延着继承链,指针从上到下进行传递,同时在不同的子类中可以向内存添加必要的属性。最后直到我们当前类中把内存地址赋值给self参数。当然,如果调用[super init]失败的话,通过判断self来决定是否执行子类的初始化操作。