美文网首页iOS开发
iOS开发——Dump一个OC类的所有方法

iOS开发——Dump一个OC类的所有方法

作者: coderanger | 来源:发表于2018-01-22 14:18 被阅读25次

    经常需要完成一个比较非寻常的需求,如果按照常规思路,可能很难实现或者甚至无法完成,为了更方便高效的实现需求,有的时候难免需要去dump一个类的所有方法,包括私有方法,看看是否有能帮得上的。

    JavaScriptContext 一创建完成就给 context 注册 js 方法

    需求如题,如果是你,你一定首先想到看看JavaScriptCore有没有暴露出对应的 delegate 方法可以直接用,抱歉,还真没有。那该怎么办?怎么办?么办?办?......

    记得之前有一篇关于 JSBridge 的文章有提到,直接 NSObject 类有一个方法,webView:didCreateJavaScriptContext:forFrame:,从语义上看,应该就满足上面的需求。

    好,写个 NSObject 的分类实现下看看。

    @interface NSObject (FKUIWebView)
    
    @end
    
    @implementation NSObject (FKUIWebView)
    - (void)webView:(id)unuse didCreateJavaScriptContext:(JSContext *)ctx forFrame:(id)frame {
        ctx[@"printHello"] = ^(void){
                NSLog(@"Hello!-----From Native");
        };
    }
    @end
    

    测试很简单,在 web 页面的 js 脚本里,调用 printHello(); 即可。

    实践证明:好使!

    Dump 一个 OC 类的所有方法

    熟悉 runtime 的话,这个很简单,调用 class_copyMethodList 把类里所有的方法取出来打印就好。有的时候,为了分析一个需求如何实现,可能要递归打印几个类的方法,从当前类,到其父类,到其爷爷类,...直到 NSObject 类。

    #include <objc/runtime.h>
    void DumpObjcMethods(Class clz)
    {
        unsigned int methodCount = 0;
        Method *methods = class_copyMethodList(clz, &methodCount);
        printf("Found %d methods on '%s'\n", methodCount, class_getName(clz));
    
        for (unsigned int i = 0; i < methodCount; i++)
        {
            Method method = methods[i];
    
            printf("\t'%s' has method named '%s' of encoding '%s'\n",
                   class_getName(clz),
                   sel_getName(method_getName(method)),
                   method_getTypeEncoding(method));
            /**
             *  Or do whatever you need here...
             */
        }
        free(methods);
    }
    

    感谢 oc 语言的创始人和开发者,每个类的类方法、实例方法都几乎可以做到望文生义,才让大家能有这一快乐!

    最后,enjoy yourself!

    相关文章

      网友评论

        本文标题:iOS开发——Dump一个OC类的所有方法

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