Self关键字

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来决定是否执行子类的初始化操作。

参考链接

//www.greatytc.com/p/9b36e1b636d8

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。