OC 中 self 与 super 总结

一段代码引发的思考:

@implementation Son : Father

- (id)init
{
    self = [super init];
    if (self) {
        NSLog(@"%@", NSStringFromClass([self class]));  //Son
        NSLog(@"%@", NSStringFromClass([super class]));  //Son
    }
    return self;
}

@end

问题1:self 是什么 ?

问题2:super 是什么 ?

问题3:[super init] 到底做了什么 ?

问题4:为什么把 [super init] 的地址赋值给 self ?

问题5:为什么NSLog的输出都Son ?

 

一、答案区

答1:

  1> self 是 OC 提供保留字;

  2> self 代表着当前方法的调用者;

  3> 在 - 方法中,self代表着"对象";

  4> 在 + 方法中,self代表着"类";

  5> self 是方法的隐藏的参数变量,指向当前调用方法的对象,另一个隐藏参数是 _cmd,代表当前类方法的selector。

 

答2:

  1> super 是 OC 提供保留字;

  2> super 不是隐藏的参数,它只是一个"编译器指示符"。查找方法时,指定方法查找的位置在父类。

 

答3:

  1> 递归初始化父类对象,直到root对象;

 

答4:

  1> 整个对象过程中只有一个对象 self ,不存在父类对象的指针;

  2> 对象内部不管是 self 还是 super 其消息主体只有一个就是 self ,也就是说 self 和 super 指向的是同一个对象;

  3> 在父类初始化失败的时候,返回nil,终止操作。

 

答5:

  1> 参见 答4 ,结果显而易见,self 和 super是同一个实体。

 

二、疑惑区

解析:

  1> 面向对象过程中,子类继承父类,就拥有了父类所有的属性方法,一个完整的类的初始化包括子类初始化和父类初始化。

  2> 子类 [alloc init] 后,首先这里只有一个对象实体self,没有所谓的父类对象实体super。初始化过程中,父类属性、方法初始化都属于子类对象的一部分,super 的指针赋给 self 这一说法是错的,其实全部指的是该对象的初始位置。

 

总结的过程中参考了以下链接:

1. 关于 self 和 super 在 OC 中的疑惑与解析(帮助很大)

2. self = [super init] 的学习

3. self = [super init] 的思考

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值