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