笔记

作者: _风雨 | 来源:发表于2021-10-20 11:42 被阅读0次

    摘录

    主类执行了foo方法,分类也执行了foo方法,在执行的地方执行了foo方法,主类的foo会被覆盖么? 如果想只想执行主类的foo方法,如何去做?

    主类的方法被分类的foo覆盖了,其实分类并没有覆盖主类的foo方法,只是分类的方法排在方法列表前面,主类的方法列表被挤到了后面, 调用的时候会首先找到第一次出现的方法。
    如果想要只是执行主类的方法,可逆序遍历方法列表,第一次遍历到的foo方法就是主类的方法
    
    - (void)foo{   
      [类 invokeOriginalMethod:self selector:_cmd];
    }
    
    + (void)invokeOriginalMethod:(id)target selector:(SEL)selector {
        uint count;
        Method *list = class_copyMethodList([target class], &count);
        for ( int i = count - 1 ; i >= 0; i--) {
            Method method = list[i];
            SEL name = method_getName(method);
            IMP imp = method_getImplementation(method);
            if (name == selector) {
                ((void (*)(id, SEL))imp)(target, name);
                break;
            }
        }
        free(list);
    }
    
    

    相关文章

      网友评论

          本文标题:笔记

          本文链接:https://www.haomeiwen.com/subject/wcreoltx.html