类的继承
cmd + →: 光标跳到这一行的最后面
cmd + ←: 光标跳到这一行的最前面
cmd + ↑: 光标跳到这一行的最上面
cmd + ↓: 光标跳到这一行的最下面
alt + ←: 光标跳过一个单词的最后面
alt + →: 光标跳过一个单词的最前面
shift + alt + k:
Xcode插件管理器 Alcatra
安装命令
Xcode插件管理器 Alcatra
安装命令
curl -fsSL https://raw.github.com/supermarin/Alcatraz/master/Scripts/install.sh | sh
继承: 子类可以继承父类的特征和行为
OC继承的特点:
1.单根继承: 只有一个根类(基类), NSObject
2.单向继承: 每个类只有一个父类, 但可以有多个子类
继承的好处: 把相同的特征和行为定义在父类中, 子类只需要继承父类就可以拥有这些特征和行为, 子类只需要写自己独有的特征和行为
普通僵尸
Zombie.h
//继承关系的体现 @interface Zombie : NSObject { //血量, 攻击力, 移动速度 NSInteger _HP; NSInteger _attact; CGFloat _speed; } - (void)setHP:(NSInteger)HP; - (NSInteger)HP; - (void)setAttact:(NSInteger)attact; - (NSInteger)attact; - (void)setSpeed:(CGFloat)speed; - (CGFloat)speed; //⾏⾛ 攻击 死亡 - (void)move; - (void)eat; - (void)die; @end
Zombie.m
#import "Zombie.h"
@implementation Zombie - (void)setHP:(NSInteger)HP { _HP = HP; } - (NSInteger)HP { return _HP; } - (void)setAttact:(NSInteger)attact { _attact = attact; } - (NSInteger)attact { return _attact; } - (void)setSpeed:(CGFloat)speed { _speed = speed; } - (CGFloat)speed{ return _speed; } - (void)move { NSLog(@"移动"); } - (void)eat { NSLog(@"真是美味"); } - (void)die { NSLog(@"挂了"); } @end
main.m 普通僵尸 Zombie *zombie = [[Zombie alloc] init]; //实例变量 [zombie setHP:50]; [zombie setAttact:5]; [zombie setSpeed:100]; NSLog(@"%ld %ld %.2lf", [zombie HP], [zombie attact], [zombie speed]); //方法 [zombie move]; [zombie eat]; [zombie die];
路障僵尸
从父类继承过来的的实例变量(特征)
RoadZombie.h #import "Zombie.h" @interface RoadZombie : Zombie { //装备 NSString *_prop; } - (void)setProp:(NSString *)prop; - (NSString *)prop; //失去装备 - (void)lostProp; @end
RoadZombie.m #import "RoadZombie.h" @implementation RoadZombie - (void)setProp:(NSString *)prop{ _prop = prop; } - (NSString *)prop { return _prop; } - (void)lostProp { NSLog(@"%@装备掉了", _prop); _prop = @""; } //当从父类继承的方法, 不满足子类的需求时, 重写父类的方法 //注: 重写父类的方法, 不需要写声明部分 - (void)move { NSLog(@"摩擦,摩擦!"); } @end
main.m
RoadZombie *roadZombie = [[RoadZombie alloc] init];
[roadZombie setHP:70]; [roadZombie setAttact:7]; [roadZombie setSpeed:140]; NSLog(@"%ld %ld %.2lf", [roadZombie HP], [roadZombie attact], [roadZombie speed]); //从父类继承过来的的方法(行为) [roadZombie move]; [roadZombie eat]; [roadZombie die]; //自己独有的 [roadZombie setProp:@"路障"]; NSLog(@"%@", [roadZombie prop]); [roadZombie lostProp];
铁桶僵尸
从父类继承过来的的实例变量(特征)
DrumZombie.h #import "RoadZombie.h" @interface DrumZombie : RoadZombie { NSString *_weakness; } - (void)setWeakness:(NSString *)weakness; - (NSString *)weakness; @end
DrumZombie.m #import "DrumZombie.h" @implementation DrumZombie - (void)setWeakness:(NSString *)weakness { _weakness = weakness; } - (NSString *)weakness { return _weakness; } - (void)move { //super: 编译指令, 用于调用父类的方法 [super move]; NSLog(@"在光滑的地面上"); } @end
main.m DrumZombie *drumZombie = [[DrumZombie alloc] init]; [drumZombie setHP:100]; [drumZombie setAttact:10]; [drumZombie setSpeed:180]; [drumZombie setProp:@"铁桶"]; NSLog(@"%ld %ld %.2lf %@", [drumZombie HP], [drumZombie attact], [drumZombie speed], [drumZombie prop]); //从父类继承过来的的方法(行为) [drumZombie move]; [drumZombie eat]; [drumZombie die]; //自己独有的 [drumZombie setWeakness:@"怕磁铁"]; NSLog(@"%@", [drumZombie weakness]); [drumZombie lostProp];
NSObject常见的方法
1.+alloc, 开辟内存空间
2.-init, 初始化方法(清空操作)
3.-class, 获取对象的类型
4.+class, 获取类的类型
5.isKindOfClass: 判断对像是不是属于某个类
6.isMemberOfClass: 判断对象是不是某个类的实例(对象)
Zombie *a = [[Zombie alloc]init]; NSLog(@"%@", [a class]); NSLog(@"%@", [Zombie class]); BOOL result = [a isKindOfClass:[zombie class]]; result = [drumZombie isMemberOfClass: [drumZombie class]]; NSLog(@"%hhd", result);
方法调用的机制: 先从自身类中找方法, 如果找到, 就调用, 没有找到, 就去父类中找, 父类没有找到, 就去父类的父类中找, 直到找到方法, 并调用
系统的init: 清空实例变量的值
重写init方法: 当需要为实例变量赋初始值时
自定义初始化方法: 根据外部传入的参数, 为实例变量赋值
自定义初始化方法
1.-号方法
2.返回值是id或者instancetype(id: 相当于void *, 对象类型, 可以代指任意对象类型)
3.必须以init开头
4.第一个参数前加with
- (instancetype)initWithName:(NSString *)name age:(NSInteger)age gender:(NSString *)gender;
便利构造器
1.+号方法
2.返回值是id或者instancetype
3.必须以类名开头
4.第一个参数前加with
+ (instancetype)boyWithName:(NSString *)name age:(NSInteger)age gender:(NSString *)gender;
Boy.m - (instancetype)initWithName:(NSString *)name age:(NSInteger)age gender:(NSString *)gender { self = [super init]; if (self) { _name = name; _age = age; _gender = gender; } return self; } + (instancetype)boyWithName:(NSString *)name age:(NSInteger)age gender:(NSString *)gender { //1 // Boy *boy = [[Boy alloc] init]; // [boy setName:name]; // [boy setAge:age]; // [boy setGender:gender]; //2 Boy *boy = [[Boy alloc] initWithName:name age:age gender:gender]; return boy; //3 return [[Boy alloc] initWithName:name age:age gender:gender]; //注: 2, 3种写法建立在写了自定义初始化方法的基础上 }
main.m Boy *boy = [[Boy alloc] init]; NSLog(@"%@", [boy gender]); [boy setName:@"李四"]; [boy setAge:20]; [boy setGender:@"未知"]; [boy sayHi]; //自定义初始化方法, 初始化 + 实例变量赋值 Boy *boy1 = [[Boy alloc] initWithName:@"叶良辰" age:25 gender:@"男"]; [boy1 sayHi]; //便利构造器 = 开辟内存空间 + 初始化 + 实例变量赋值 Boy *boy3 = [Boy boyWithName:@"福尔康" age:38 gender:@"你猜"]; [boy3 sayHi];