一、继承
面向对象的三大特性:封装、继承、多态。
继承:既能保证类的完整,又能简化代码。把公共的方法和实例变量写在父类里,子类只需要写自己独有的实例变量和方法即可。
继承的特点:
1. 没有父类的类称为根类,OC中的根类是NSObject(祖宗)。
2. 继承的上层:父类,继承的下层:子类。
3. 继承的内容:所有的实例变量和方法。
4. 继承是单向的,不能互相继承。
5. 继承具有传递性:A继承于B,B继承于C,A具有B和C的特征和行为。
6. 如果子类不满意父类方法的实现,可以重写(overwrite)父类的方法。重写不需要在重写不需要在.h文件里显示声明,只需要在.m文件里重新实现。当在外面main函数调用时,会默认调用重写的方法。屏蔽掉,会继续调用父类的方法。
二、super self
super:编译器指令,并非对象。
作用:给super发消息,可以执行父类该方法的实现。当需要重写父类的方法时,如果不知道父类的方法的实现是什么,最好先使用super调用一下父类对该方法的实现然后再去写自己的代码。
重写从父类继承过来的方法的三种情况:
1. 完全以子类的实现内容为主,丢弃父类实现的内容。
2. 完全以父类的实现内容为主,没有子类实现的内容。
3. 既有父类对该方法的实现,也有子类对该方法的实现。
self:系统关键字,在方法中指代当前方法的调用者。实例方法中,指代调用当前方法的对象。类方法中,指代当前类。
三、初始化方法
初始化方法在对象的生命周期中只使用一次。
初始化方法特征:
1. 初始化方法是”-“方法。
2. id或者instancetype类型的返回值。
3. 以init开头。
4. 可以带0到多个参数。
内部实现:先执行super的初始化方法,再初始化自身变量,后return self。
示例:
-(instancetype)init
{
//给super发送init消息:执行父类中实现的init方法
self = [super init];
//判断从父类继承过来的init方法是否初始化成功
if (self) {
//初始化设置
}
//返回初始化完成的对象
return self;
}
四、指定初始化方法
指定初始化方法:无论调用哪一个初始化方法都会调用的初始化方法。
通常会把初始化时想做的操作全部放到指定初始化方法中,这样就无需在每一个初始化方法中都要写一遍,简化代码,方便后期维护。
选取原则:一般选参数最多的初始化方法作为指定初始化方法.
示例:
- (instancetype)initWithName:(NSString*)name age:(NSInteger)age sex:(NSString *)sex
{
self = [super init];
if (self) {
_name = name;
_age = age;
_sex = sex;
}
return self;
}
五、便利构造器
便利构造器:封装了对象创建的过程。
内部实现:封装了alloc和初始化操作,创建对象更加方便快捷。
特征:
1. 便利构造器是”+”方法。
2. 返回本类型的实例。
3. 方法名以类名开头。
4. 可以有0到多个参数。
示例:
+(Person *)personWithName:(NSString *)name age:(NSInteger)age sex:(NSString *)sex
{
Person *p = [[Person alloc] initWithName:name age:age sex:sex];
return p;
}