1. 程式人生 > >OC方法呼叫過程

OC方法呼叫過程

@interface Person : NSObject
 
- (void)personMethod;
+ (void)personClassMethod;
 
@end
 
@implementation Person
 
- (void)personMethod {};
+ (void)personClassMethod {};
 
@end

Person新建的物件是怎樣去呼叫物件方法personMethod

  1. instance物件的isa指向class。
  2. 當呼叫物件方法時,通過instance的isa找到class,再找到物件方法進行呼叫(因為物件方法儲存在class中)。

 Person新建的物件是怎樣去呼叫類方法personClassMethod

  1.  instance物件的isa指向class。
  2. class物件的isa指向class。
  3. 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

  1. 通過Student的例項物件的isa指標找到Student的class。
  2. 在Student的class內部找是否存在- (void)personMethod;方法。
  3. 不存在,通過Student的class內的superclass找到Person的class。
  4. 在Person的class內部找是否存在- (void)personMethod;方法,存在則呼叫方法

Student新建的物件是怎樣呼叫父類Person中的類方法

personClassMethod 

  1. 通過Student的例項物件的isa指標找到Student的meta-class。
  2. 在Student的meta-class內部找是否存在- (void)personClassMethod;方法。
  3. 不存在,通過Student的meta-class內的superclass找到Person的meta-class。
  4. 在Person的class內部找是否存在- (void)personClassMethod;方法,存在則呼叫方法

Student新建的物件是怎樣呼叫NSObject中的類方法[Student load]  

  1. 通過Student的例項物件的isa指標找到Student的meta-class。
  2. 在Student的meta-class內部找是否存在+ (void)load;方法。
  3. 不存在,通過Student的meta-class內的superclass找到Person的meta-class。
  4. 在Person的class內部找是否存在+ (void)load;方法。
  5. 不存在,通過Person的meta-class內的superclass找到NSObject的meta-class。
  6. 在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