OC方法呼叫過程
阿新 • • 發佈:2019-02-10
@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