ios开发self和super的区别

转载

self和super区别

self

  1. 是关键字
  2. 代表当前方法的调用者 
    • 如果是类方法:代表当前类
    • 如果是对象方法:代表当前类的对象

super

编译器指令

[self message]和[super message]的实现

其实不管是self还是super真正调用的对象都是一样的,只是查找方法的位置不一样,self是从当前类结构中开始查找,super是从父类中查找,但方法真正的接受者都是当前类或者当前类的对象

[self message]:

会转化为objc_msgSend(id self,SEL _cmd)这个函数,在当前类结构中找到方法并且调用

[super message]

会转化为id objc_msgSendSuper(struct __rw_objc_super *super, SEL op, …) 
,对比[self message]这里除了函数名加了super以外,第一个参数由self变成了一个结构体,下面让我们来解开这个结构体的真面目

 
  • 1
  • 2
  • 3
  • 4
  • 5

这个结构体中有两个参数:object的对象和一个superClass的结构体指针,这里的object相当于上面的self 
在执行[super message]时,会做下面的事 
1. 编译器会先构造一个__rw_objc_super的结构体 
2. 然后去superClass的方法列表中找方法 
3. 找到之后由object调用。 
所以当你用[self Class]和[super Class]打印类的时候,打印的都是同一个类,因为他们只是查找方法的位置不同,但是调用方法的类/对象是一样的.

为什要写self = [super init]?

因为在Xcode中,你输入init然后tab就会帮你补全这个方法,以至于我一直都忽略了为什么在[super init]之后还要赋值给self,然后进行判断,其实这和类簇有关系,我们不能保证init的内存和alloc出来的内存是同一块内存,像NSString在alloc和init之后的对象分别是NSPlaceholderString__NSCFConstantString*造成[super init]之后的内存被改变,所以在[super init]之后是nil,因此我们不能保证alloc和init的是同一块内存,加上这样的判断是为了提高容错性,如果init成功就返回对象,否则返回nil.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值