继承、初始化方法、便利构造器

Objective-C学习笔记_继承、初始化方法、便利构造器

分类:objective-ciOS

一、继承

继承的上层:父类,继承的下层:子类。继承是单向的,不能相互继承。继承具有传递性:A继承于B,B继承于C,A具有B和C的特征和为。子类能继承父类全部的特征和行为。

例题 打僵尸。需求: 1、定义普通僵尸类: 实例变量:僵尸总血量、僵尸每次失血量。 方法:初始化方法(总血量)、被打击失血、死亡。 2、定义路障僵尸类: 实例变量:僵尸总血量、僵尸每次失血量,道具,弱点。 方法:初始化方法(总血量)、被打击失血、失去装备、死亡。 3、定义铁桶僵尸类: 实例变量:僵尸总血量、僵尸每次失血量,道具,弱点。 方法:初始化方法(总血量)、被打击失血、失去装备、死亡。 4、在main.m中创建普通僵尸对象,设置总血量50,每次失血量为 3,没有道具。 5、在main.m中创建路障僵尸对象,设置总血量80,每次失血量为 2,设置道具为路障。 6、在main.m中创建铁桶僵尸对象,设置总血量120,每次失血量为 1,设置道具为铁桶。

如果定义三个类:普通僵尸、路障僵尸、铁桶僵尸。它们会有很多重复的实例变量和方法,这不仅是体力活,而且也不科学。面向对象提供了继承语法,能大简化代码。把公共的方法和实例变量写在父类里,子类只需要写己独有的实例变量和方法即可。继承既能保证类的完整,又能简化代码。

继承实现: NSObject@end: OrdinaryZombie@end继承特点

Objective-C中只允许单继承。没有父类的类称为根类,,Objective-C中的根类是NSObject(祖宗)。

继承的内容:所有实例变量和方法。如果子类不满意父类方法的实现,可以重写(overwrite)父类的方法。

继承树

继承中法的执行

self、super

self和super是Objective-C语言中的关键字。

super是编译器指令,并非对象。

作用:给super发消息,可以执父类中实现的方法。

子类可以重写父类的方法,即:子类既有己的实现,有父类继承下来的实现,如果想使用父类的实现,向super发送消息。

self作用:调用自身的方法和属性,始终代表调用方法的对象。

self和super使用的简单示例代码如下:

– (instancetype)initWithName:(NSString *)namesex:(NSString *)sex{/** 详细解释[super init]* 父类中定义的实例变量通过向super请求初始化方法来得到初始化* 向super请求初始化方法的消息连接起了所有继承树上的对象* 父类的变量会比子类的变量先得到初始化* 例如: CollegeStudent对象在初始化时, 会依次对NSObject, Student, CollegeStudent进行初始化* 关于初始化方法, 请查阅本博文下面内容*/self = [super init];if (self) {_name = name;_sex = sex;}return self;}二、初始化方法

使用Objective-C创建对象分为两步:

内存分配(开辟空间):为新对象动态的分配一段内存地址。初始化:为这段内存空间赋初始值。

初始化方法在对象的整个生命周期里只使用一次。初始化方法命名一般以init开头;初始化方法可以在对象创建的时候给实例变量赋初值;初始化方法的返回值只能是id(或instancetype)或本类对象,不能是void。一个类可以有多个初始化方法。

完整的初始化方法,示例代码如下:

– (instancetype)initWithName:(NSString *)namesex:(NSString *)sex{// 给super发送init消息: 即执行父类中实现的init方法self = [super init];if (self) {// 初始化设置_name = name;_sex = sex;};}

注意:

初始化过程初始化法的特征三、便利构造器

便利构造器在初始化方法的基础上进行了封装,即封装了对象的创建过程。便利构造器是“+”号方法,返回 本类型 的实例,方法名以类名开头。可以有0到多个参数。内部实现,封装了alloc和初始化方法。使起来更加简洁。

便利构造器的实现

1.声明和实现便利构造器。

+ (instancetype)personWithName:(NSString *)namesex:(NSString *)sex;+ (instancetype)personWithName:(NSString *)namesex:(NSString *)sex{Person *person = [[Person alloc] initWithName:name sex:sex];return person;}

2.使便利构造器创建对象。

Person *person = [Person personWithName:@”小红” sex:@”女”];

其实,便利构造器的便利不仅是代码量的减少,也是对内存操作的便利,如果用便利构造器创建了一个对象,则在使用完毕后不用去释放该对象,出了自动释放池后,对象被自动销毁,在自动释放池销毁之前,我们持有对象,不用理会什么时候释放该对象(这是Objective-C内存管理的内容,博主会在后续的博文中详细说明)。

附录开篇例题“打僵尸”的代码实现

本例题利用继承实现,题目要求较为简单,请仔细阅读代码。

普通僵尸类 OrdinaryZombie.h 代码如下:

: NSObject{_lossOfBlood; *_weakness; /* 弱点 */}/* 实例变量setter, getter方法 */- (void)setFullOfBlood:(NSInteger)fullOfBlood;- (NSInteger)fullOfBlood;- (void)setLossOfBlood:(NSInteger)lossOfBlood;- (NSInteger)lossOfBlood;- (void)setEquipment:(NSString *)equipment;- (NSString *)equipment;- (void)setWeakness:(NSString *)weakness;- (NSString *)weakness;/* 初始化方法(总血量) */- (id)initWithBlood:(NSInteger)fullOfBlood;/* 被打击失血 */- (void)attacked;/* 死亡 */- (void)death;/* 失去装备 */- (void)loseEquipment;@end要知道,当你一直在担心错过了什么的时候,其实你已经错过了旅行的意义。

继承、初始化方法、便利构造器

相关文章:

你感兴趣的文章:

标签云: