@interface Person : NSObject
- (void)personMethod;
+ (void)personClassMethod;
@end
@implementation Person
- (void)personMethod {};
+ (void)personClassMethod {};
@end
Person新建的对象是怎样去调用对象方法personMethod
- instance对象的isa指向class。
- 当调用对象方法时,通过instance的isa找到class,再找到对象方法进行调用(因为对象方法存储在class中)。
Person新建的对象是怎样去调用类方法personClassMethod
- instance对象的isa指向class。
- class对象的isa指向class。
- meta-class对象的isa指向基类的meta-class对象,再找到类方法进行调用(因为类方法存储在元类对象中)。
@interface Student : Person
- (void)studentMethod;
+ (void)studentClassMethod;
@end
@implementation Student
- (void)studentMethod {};
+ (void)studentClassMethod {};
@end
现有Student对象继承于Person对象。Student->Person->NSObject
Student新建的对象调用自身的类方法和对象方法过程和上面的Person一致
Student新建的对象是怎样调用父类Person中的对象方法personMethod
- 通过Student的实例对象的isa指针找到Student的class。
- 在Student的class内部找是否存在- (void)personMethod;方法。
- 不存在,通过Student的class内的superclass找到Person的class。
- 在Person的class内部找是否存在- (void)personMethod;方法,存在则调用方法
Student新建的对象是怎样调用父类Person中的类方法personClassMethod
- 通过Student的实例对象的isa指针找到Student的meta-class。
- 在Student的meta-class内部找是否存在- (void)personClassMethod;方法。
- 不存在,通过Student的meta-class内的superclass找到Person的meta-class。
- 在Person的class内部找是否存在- (void)personClassMethod;方法,存在则调用方法
Student新建的对象是怎样调用NSObject中的类方法[Student load]
- 通过Student的实例对象的isa指针找到Student的meta-class。
- 在Student的meta-class内部找是否存在+ (void)load;方法。
- 不存在,通过Student的meta-class内的superclass找到Person的meta-class。
- 在Person的class内部找是否存在+ (void)load;方法。
- 不存在,通过Person的meta-class内的superclass找到NSObject的meta-class。
- 在NSObject的meta-class内部找是否存在+ (void)load;方法,存在则调用。
总结
isa
- instance的isa指向class
- class的isa指向meta-class
- meta-class的isa指向基类的meta-class
superclass
- class的superclass指向父类的class
- 如果没有父类,superclass指针为nil
- meta-class的superclass指向父类的meta-class
- 基类的meta-class的superclass指向基类的class