self & super
疑问
类
父类:GLPerson: NSObject
子类:GLStudent: GLPerson
先看代码:
问:以下分别返回什么?
[self class]
[super class]
[self superclass]
[super superclass]
正常返回如下:
GLStudent
GLStudent
GLPerson
GLPerson
问2: 如果父类实现右侧代码,返回什么?
- (Class)class {
return [GLPerson class];
}
结果:
返回如下:
GLStudent
GLPerson
GLPerson
GLPerson
疑问
1:[super class] 在父类没有实现时,返回的是子类
2:[super superclass] 返回的是父类,而不是父类的父类
验证
代码实验
类继承:GLStudent --> GLPerson --> GLAnimal --> NSObject
下面在GLStudent 里执行代码
初始化时,都没有重写 class 方法
验证 : [self class]
都没有重写 class 方法
返回当前 GLStudent
当前GLStudent 重写 class 方法
返回当前 GLStudent
当前GLStudent没有重写,
只有父类 GLPerson 重写 class 方法
返回 重写的父类 GLPerson
总结:从当前类开始往父类寻找,判断是否实现class,实现就返回,都没有实
现,系统默认返回当前消息接受者 class。
验证 : [super class]
都没有重写 class 方法
返回当前 GLStudent
父类 GLPerson 重写 class 方法
返回 重写的父类 GLPerson
不管GLStudent 有没有重写
总结:
1.从【当前接受者的父类】开始往顶遍历,实现类class 就返回,
2.父类都没有实现, 系统默认 返回当前消息接受者 class。而不是其父类
验证 : [self superclass]
都没有重写 class 方法
返回 父类 GLPerson
当前GLStudent 重写 class 方法
返回父类 GLPerson
父类 GLPerson 重写 class 方法
返回 重写的父类 GLAnimal
父类的父类 GLAnimal 重写 class 方法
返回 重写的父类 NSObject
总结: 重写 class ,会直接影响 superclass 方法结果
1. 都没有重写,返回当前调用者的父类(系统处理)
2. 从【当前开始】依次遍历,返回第一个重写class的对象的父类
验证 : [self superclass]
都没有重写 superclass 方法
返回 父类 GLPerson
当前GLStudent 重写 superclass 方法
返回 当前 GLStudent
父类 GLPerson 重写 superclass 方法
返回 重写的父类 GLPerson
父类的父类 GLAnimal 重写 superclass 方法
返回 重写的父类 GLAnimal
总结:
1. 都没有重写,返回当前调用者的父类(系统处理)
2. 从【当前开始】依次遍历,返回第一个重写superclass 的对象
验证 : [super superclass]
都没有重写 superclass 方法
返回 父类 GLPerson
当前GLStudent 重写 superclass 方法
返回 GLPerson
父类 GLPerson 重写 superclass 方法
返回 GLPerson
父类的父类 GLAnimal 重写 superclass 方法
返回 GLAnimal
总结:
1. 都没有重写,返回当前调用者的父类(系统处理)
2. 从【父类开始】依次遍历,返回第一个重写superclass的类
self = [super init];
延着继承链初始化的内存指针会被从上到下传递,最后初始化当前子类
tag