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 
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页