继承
- 上层:父类;下层:子类
- 继承是单向的,不能相互继承
- 集成具有传递性:A继承于B,B继承于C,A具有B和C的特征和行为
- 子类能继承父类全部的特征和行为
- 把公共的⽅法和实例变量写在父类⾥里,子类只需要写⾃⼰己独有的实例变量和方法即可
- 继承既能保证类的完整,又能简化代码
- 没有父类的类称为根类,OC中的根类是NSObject(祖宗)
继承实现
// 子类 父类
@interface CommonZombie : NSObject{
}
#import "CommonZombie.h"
// 子类 父类
@interface BarricadeZombie : CommonZombie{
}
继承中方法的执行:逐级向上查找
给CollegeStudent对象发送消息: study
- 查找本类中是否实现(重写)study⽅法
- 如果没有,查找⽗类中study是否实现
- 逐级向上查找,找到即执⾏
- 如果NSObject也没实现,会抛出异常,引起Crash
super
super是编译器指令,并⾮对象。
作⽤:给super发消息,可以执⾏⽗类中实现的⽅法
⼦类可以重写⽗类的⽅法,即:⼦类既有⾃⼰的实现,⼜有⽗类继承下来的实现,如果想使⽤⽗类的实现,向super发送消息
初始化⽅法
创建对象分两步:开辟空间、初始化。
初始化⽅法的主要作⽤是:为某些实例变量赋初值。
初始化⽅法在对象的整个⽣命周期⾥只使⽤⼀次。
- (id) init
{
//给super发送init消息:即执行父类中实现的init方法
self = [super init];
if(self)
{
//初始化设置
}
//返回初始化完成的对象
return self;
}
⼦类定义了除⽗类中公共实例变量之外的实例变量。在⾃⾝的初始化⽅法中,优先向super发送init消息,初始化公共变量,初始化成功之后,再初始化⾃⾝特有变量,从⽽完成全部实例变量的初始化
初始化过程
- ⾃⼰的初始化⽅法中,优先调⽤⽗类的初始化⽅法
- ⽗类的初始化⽅法中再调⽤⽗类的初始化⽅法,依次往上调⽤
- 处于最上层的初始化完成之后,回到第⼆层的初始化⽅法中,完成第⼆层的初始化
- 第⼆层的初始化完成之后,回到第三层的初始化⽅法中,依次执⾏初始化⽅法,直到本类的初始化⽅法完成
初始化⽅法特征
- 初始化⽅法是 “-”⽅法(对象方法)
- 返回值类型是:id或者instancetype
- 以init开头
- 可以带0到多个参数
- 内部实现:先执⾏super的初始化⽅法,再初始化⾃⾝变量,return self
便利构造器
- 封装了对象创建过程
- 便利构造器是“+”⽅法,返回本类型的实例,⽅法名以类名开头
- 可以有0到多个参数
- 内部实现:封装了alloc和初始化⽅法。使⽤起来更加简洁
便利构造器的实现
//声明和实现便利构造器
+(id)personWithName:(NSString *)name
{
Person *p =[[Person alloc] initWithName:name];
return p;
}
//使用便利构造器创建对象
Person *p = [Person personWithName:@"张三"];