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 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值