1.oc中的继承关系
在oc中建立继承关系之后,子类就可以继承父类
a.继承实例变量 @public @protected @private
b.公开的方法(写在父类.h文件的方法)
c.oc继承是单继承,就意味着一个类只能有一个父类,但是一个类可以有多个子类
d.oc中的继承是单根类继承:所有类的祖先都是NSObject,NSObject是所有类的基类
2.定义在.m文件中的实例变量只属于当前的实例变量,在其他任何别的文件中都看不到
3.oc中没有绝对私有的实例变量
4.一个方法只是在一个类中.m文件写了实现部分,此时,这个方法是这个类的私有方法,子类也不可以直接访问
5.oc中的方法也是没有绝对的私有
6.:冒号后面跟的是哪个类名,继承就是哪个类;:冒号把父类的所有的东西都继承过来了,包括实例变量和方法
7.在子类中不能定义和父类同名的实例变量
8.子类在调用方法的时候,优先去自己的类中去找有没有实现这个方法,如果没有实现就去他的父类中去查找有没有实现,一直到NSObject这个基类中,其中如果有个类实现了这个方法就会停止查找
子类在查找方法的优先级:自身——>父类——>在往更高的类中查找
9.重写父类的方法:父类提供的方法不能够满足子类的需求,这时就需要重写父类的方法
10.在子类中重写父类的方法是不需要声明的
重写父类的方法有两种:一种是完全重写父类的方法;另一种是在父类方法实现的基础上,补充功能,此时,需要用到一个关键字:super
super是编译指令,拥有调用父类的方法
11.便利构造器 又叫工厂方法
用于快速创建出对象
12.便利构造器的格式:
a. 便利构造器方法是一个类方法,以 + 号开头
b 以类名开头,(且类名要小写)+ With + 实例变量名(且With后的实例变量去掉下划线首字母要大写)animalWithEye
c.一定要有返回值,返回值是id类型的
13.无论调用哪一个初始化都会走的那个初始化方法就叫做指定初始化方法
14.instancetype和id是一样的都是泛类型对象
15.版本1 此时初始化时,不仅自身的实例变量进行了初始化也给父类的实例变量进行了初始化
缺点:初始化时,需要关心父类的实例变量
//- (id)init{
//
// _eye =2;
// _hair = @"长毛";
// _leg = 4;
// _color = @"金黄色";
// _kind = @"金毛";
// return self;
//
//}
//
// _eye =2;
// _hair = @"长毛";
// _leg = 4;
// _color = @"金黄色";
// _kind = @"金毛";
// return self;
//
//}
版本2:初始化只给自身的实例变量赋值
缺点:从父类中的继承过来的实例变量没有被赋值
//- (id)init{
// _color = @"金黄色";
// _kind = @"金毛";
// return self;
//}
// _color = @"金黄色";
// _kind = @"金毛";
// return self;
//}
版本3 :初始化时,先调用父类的[super init]的方法,对父类的实例变量进行了赋值,之后在对自己的实例变量进行赋值
缺点:父类的初始化方法有可能失败,返回的是一个空指针nil
//- (id)init{
// self = [super init];
// _color = @"金黄色";
// _kind = @"金毛";
// return self;
//}
// self = [super init];
// _color = @"金黄色";
// _kind = @"金毛";
// return self;
//}
版本4:初始化时,使用self接收[super init]的返回值,然后判断self是否为nil,如果不是nil,说明父类的初始化成功了,此时,在对自身的实例变量进行初始化
- (id)init{
self = [super init];
if (self) {
_color = @"金黄色";
_kind = @"金毛";
}
return self;
}
self = [super init];
if (self) {
_color = @"金黄色";
_kind = @"金毛";
}
return self;
}
另一种也行
//- (id)init{
//
// if (self =[super init]) {
// _color = @"金黄色";
// _kind = @"金毛";
//
// }
// return self;
//}
//
// if (self =[super init]) {
// _color = @"金黄色";
// _kind = @"金毛";
//
// }
// return self;
//}
duplicate是重复的意思,有没有引入.m文件