下面是常见的初始化代码:
- (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时,才能进行子类本身对象的初始化。