一. 继承
面向对象语言的三大特征: 封装 继承 多态
继承的特点:即保证了类的完整性,又简化了代码,一定程度上消除了代码冗余.
把公共的方法与实例变量写在父类中,子类只需要写自己独有的实例变量方法.
@interface A : B
//类成员变量,成员方法,getter,setter声明
@end
@implementation A
//类成员变量,成员方法,getter,setter,定义.
@end
即A继承于B,A是B的子类,B是A的父类.
没有父类的类称为根类,例如祖宗:NSObject.并且继承是单向的,不能进行多继承.
但是,一个类可以有多个超类. 继承有传递性.
A继承于B,B继承于C,即A有C的特性.如果子类不满意父类的方法,可以重写(overwrite)父类的方法.
二. super self
super关键字,为编译器指令,即执行父类的方法.
[super init]即执行父类的初始化方法.
OC中的方法调用采用消息发送机制[receiver message]
例如找类生成对象调用类的成员方法时,首先在自己的类中寻找,若没有,则在父类中寻找,依次向上,直到NSObject即允许,若没找到则会抛出异常,引起Crash.
self类似与一个指向对象的指针.类似于Java中的this.
在继承中,如果子类不满意父类的方法实现,可以再子类当前的实现部分重写父类继承来的方法.在方法调用时,优先从对象对应类中查找方法的实现,如果不存在该方法,则依次查找父类的实现并执行.如果是重写父类实现,则只需要在当前类的m文件中重写方法实现即可.不需要在h文件中再声明该方法.
三. 初始化方法
初始化的步骤:1.为对象开辟空间 2.进行初始化操作.
初始化方法的主要作用是:为某些实例变量赋初值.
初始化对象在对象的整个生命周期里只使用一次.
一个对象的初始阶段只有一次,所以初始化方法只使用一次.
- (id)init {
//给super发送init消息:执⾏行⽗父类中实现的init⽅方法
self= [super init];//判断从⽗父类继承过来的init⽅方法是否初始化成功
if(self != nil) {//nil的意思为空对象
//初始化设置}
//返回初始化完成的对象
return self;
}
⼦类定义了除父类中公共实例变量之外的实例变量。
在⾃自⾝身的初始化⽅方法中,优先向super发送init消息,初始化公共变量,
初始化成功之后,再初始化⾃身特有变量,从⽽完成全部实例变量的初始化。
self为系统关键字指的是当前方法的调用者,
self在实例方法中,指代调用当前方法的对象,
self在类方法中,指代当前类.
self是一个系统关键字,也是一个指针,在实例方法内部是一个const类型的指针,在实例方法内部,self指代的时当前正在调用该方法的实例对象本身.
初始化的方法为-方法,返回值类型为id或者instancetype类型,以init开头,可以带0至多个参数.
id类型为void *类型,也就是泛型.
instancetype类型只能做为返回值,而id可以作为参数,也可作为返回值.使用instancetype类型作为返回值时,可以提高代码的可读性.
上述初始化代码,即先执行super的初始化方法,在进行自身变量初始化,然后return self.
自己在初始化过程中,优先调用父类的初始化方法,在依次调用超类的初始化方法.直到本类的初始化完成.
四. 指定初始化方法
类中有3个实例变量,即为有一个最全的指定初始化方法.
//Test.h文件中定义
@interface Test : NSObject
{
NSString *_name;
NSString *_age;
}
//setter
- (void)setName:(NSString *)name
age:(NSString *)age;
//getter
- (NSString *)name;
- (NSString *)age;
//指定初始化
- (instancetype)initWithName:(NSString *)name
age:(NSString *)age;
@end
//Test.m文件中实现
@implementation Test
//setter
- (void)setName:(NSString *)name
gender:(NSString *)gender{
_name = name;
_gender = gender;
}
//指定初始化
- (instancetype)initWithName:(NSString *)name
age:(NSString *)gender {
self = [super init];
if (self) {
_name = name;
_gender = gender;
}
return self;
}
//getter
- (NSString *)name {
return _name;
}
- (NSString *)gender {
return _gender;
}
@end
五. 便利构造器
便利构造器为"+"号方法,方法名以类名开头
//声明
+ (instancetype)testName:(NSString *)name
gender:(NSString *)gender;
//实现
+ (instancetype)testName:(NSString *)name
gender:(NSString *)gender {
return [[self alloc] initWithName:name
gender:gender];
}