objc runtime 随笔

#import <objc/runtime.h>

1. 替换类方法:

+ (void)load

{

    Class class = object_getClass([ClassName class]);

    Method originalMethod =class_getClassMethod(class,@selector(method1));

    Method newMethod =class_getClassMethod(class,@selector(method2));

    BOOL didAddMethod =class_addMethod(class,@selector(method1),method_getImplementation(newMethod),method_getTypeEncoding(newMethod));

    if(didAddMethod) {        class_replaceMethod(class,@selector(method2),method_getImplementation(originalMethod),method_getTypeEncoding(originalMethod));

    }else{

        method_exchangeImplementations(originalMethod, newMethod);

    }

}


2. 替换实例方法:

+(void)initialize

{

    staticdispatch_once_tonceToken;

    dispatch_once(&onceToken, ^{

        Class class = UIViewController.class; 

        Method originalMethod =class_getInstanceMethod(class,@selector(method1));

        Method newMethod =class_getInstanceMethod(class,@selector(method2));

        BOOL didAddMethod =class_addMethod(class,@selector(method1),method_getImplementation(newMethod),method_getTypeEncoding(newMethod));

        if(didAddMethod) {            class_replaceMethod(class,@selector(method2),method_getImplementation(originalMethod),method_getTypeEncoding(originalMethod));

        }else{

            method_exchangeImplementations(originalMethod, newMethod);

        }

    });

}

3. 查看类的方法列表:

    unsignedintcount;

    Method*methods =class_copyMethodList(class, &count);

    for(inti =0; i < count; i++) {

        NSLog(@"%s", sel_getName(method_getName(methods[i])));

    }

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容