IOS精选面试题(三)

2021-01-21  本文已影响0人  qinxi

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

上一篇下一篇

猜你喜欢

热点阅读