self = [super init]

下面是常见的初始化代码:
- (id) init
{
if(self = [super init])
{
//为子类增加属性进行初始化
}
return self;
}

1. self 是什么?super 是什么?

self代表着当前方法的调用者。
self是类的隐藏的参数变量,指向当前调用方法的对象(类也是对象,类对象),另一个隐藏参数是_cmd,代表当前类方法的selector。
super并不是隐藏的参数,它只是一个”编译器指示符”

2. [super init]的作用,以及为什么要进行[super init]?

[super init]的作用,是利用父类的init方法为子类实例的父类部分属性初始化。

对于对象继承,一个子类从父类继承,那么就必须要实现父类的所有功能。所以,在对子类进行初始化的时候,必须要先调用父类的初始化方法,初始化继承自父类的基本功能。就像猫,它是动物,那么他必然拥有动物的一切特征。所以,我们在初始化猫这一对象时,必须先初始化动物这一对象,并把结果赋予猫,以使猫满足属于动物这一特征。

比如说,在iOS下,所有的类都继承于NSObject,而NSObject的init方法很简单,就是return self。当父类的初始化完成之后,即self不为nil的情况下,就可以开始做子类的初始化了。

4. self 为什么要赋值为[super init](为什么不使用if([super init]))?

在初始化方法中使用self = [super init]语句是Objective-C的标准做法,可以防止父类改变对象的内存地址导致self指针指向无效内存。

5. 下面看看这个

@implementation Cat : Animal
{
    self = [super init];
    if (self)
    {
        NSLog(@"%@", NSStringFromClass([self class]));
        NSLog(@"%@", NSStringFromClass([super class]));
    }
    return self;
}@end

打印结果:
Cat
Cat

当发送class消息时,不管是self还是super其消息主体依然是self,也就是说,self和super指向的是同一个对象。只是查找方法的位置有区别,一个从本类,一个从本类的超类。

一般情况下class方法只有在根类NSObject中定义,极少情况有子类重写class方法,所以[slef class] 和 [super class] 都是在根类中找方法实现,消息接收主体又都是Cat 。

super 就是个障眼法,编译器符号,它可以替换成 [slef class],只不过方法是从self的超类开始寻找。

注意:super并不是真正的指针,[super message]的实质是由self来接受父类的message。需要注意的是,[super message]中,message方法出现的self为[super message]语境中的self,即子类实例。

6. 这么写的意义

这样做的意义在于,只有当继承自父类的对象的初始化已经完成,而且没有出现问题,即self不会是nil时,才能进行子类本身对象的初始化。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值