答:
init 中调用super的 init方法来初始化自己所包含有的父类信息
1.内存分配
内存应该在 [Class alloc]的时候就已经分配了,大小和类型应该由对应的Class来决定。而init方法只是进行对象内部各种变量的初始化,同时将retain count加一,表示目前这块内存空间有人在用
所以 [super init]并不是说返回父类的地址,而是调用父类的初始化函数,同时返回地址指针,而这个指针在[Class alloc]时,已经产生。真正决定指针类型的是alloc,不是init
2.指针指向
-(id) init{
.....
return self;
}
这个 self指针就是[SubClass alloc]分配的,指针所指对象的类型也是在这个时候确定的,后面再调用init里面的self包括super class里面的init都是这个指针
[super init]并没有生成一个新的指针,所以不存在说把父类的指针赋给子类,那个指针本来就是指向子类的
3.if判断的解释
[super init] 从工程角度说, 存在初始化失败返回nil, 所以保险起见都是要做检测
self = [super init];
if(self){
...
}
return self;
如果没有 "self =", 即使父类初始化失败, 子类还是会返回不是nil的self, 而这个对象显然是非法的对象