OC调用一个方法底层做了哪些事
一:如果是调用实例方法,通过实例对象的isa指针找到类对象,在类对象的方法缓存(cache,为一个hash表)中查找,如果找到则调用,没找到通过结构体中的bits找到class_rw_t结构体中的methods中查找,如果找到则调用,没找到则通过superclass找父类,找到父类后在父类的缓存中找,找不到在class_rw_t中找,找不到继续通过superclass寻找父类,直到基类还找不到,则走第二步
如果是调用类方法,通过类对象的isa指针找到元类对象,在元类对象的方法缓存中查找,如果找到则调用,找不到通过bits找class_rw_t的methods中查找,如果找到则调用,没找到则通过superclass找父类,找到父类后在父类的缓存中找,找不到在class_rw_t中找,找不到继续通过superclass寻找父类,直到基类还找不到,则通过基类的superclass找类对象的基类,然后查找,如果还找不到,则走第二步
二:消息的动态决议
重写resolveInstanceMethod动态添加方法,如果返回NO则走第三步
三:消息的动态转发
重写forwardingTargetForSelector返回一个用来处理这个方法的类,
重写下面两个方法生成方法签名也可以实现动态添加方法
-(NSMethodSignature*)methodSignatureForSelector:(SEL)selector;
-(void)forwardInvocation:(NSInvocation*)invocation;
如果上述的都没实现,则程序崩溃,报错unrecgnized for selector
网友评论