美文网首页
runtime的使用二

runtime的使用二

作者: heart_领 | 来源:发表于2018-06-25 14:37 被阅读4次
    #import <Foundation/Foundation.h>
    @interface Person : NSObject
    {
        NSString *title;////使用runtime可以获取到
    }
    @property(nonatomic,copy,nullable)NSString *age;//此种写法可以生产set和get方法,以及变量 _age ////使用runtime可以获取到
    - (void)name;//.m中有实现 使用runtime可以获取到该方法
    -(void)oldMethod;//.m中没有实现 使用runtime获取不到该方法
    @end
    
    #import "Person.h"
    @interface Person ()
    {
        NSString *grade;////使用runtime可以获取到
    }
    /**  */
    @property (nonatomic,copy) NSString *class;//使用runtime可以获取到
    @end
    @implementation Person
    //.h中对外公开了 使用runtime可以获取到该方法
    - (void)name{
        NSLog(@"name is sun yun fei");
    }
    //动态添加方法的实现方法 使用runtime可以获取到该方法
    -(void)addFind
    {
        NSLog(@"添加朋友成功");
    }
    //.h中没有对外公开 使用runtime可以获取到该方法
    -(void)newMethod
    {
    }
    //总结:.m中的方法可以使用runtime获取到,动态添加的方法也可以获取到
    @end
    

    动态添加方法

    - (void)viewDidLoad {
        [super viewDidLoad];
        Person *p = [[Person alloc]init];
    //    给Person类添加方法 如果要添加的方法在Person中已经存在,则添加不成功,success为NO,如果要添加的方法在Person中没有,则添加成功,success为YES。
    //    BOOL class_addMethod(Class _Nullable cls, SEL _Nonnull name, IMP _Nonnull imp,const char * _Nullable types)
        /**
         findInSelf:给Person添加的方法 (调用方法)
         addFind:调用Person的findInSelf方法,会进入addFind方法中。(实现方法)
         class_getMethodImplementation([ViewController class], @selector(addFind)):拿到ViewControllr类中的addFind方法的IMP,此IMP为方法实现的IMP。此函数中的ViewController若换成Person,调用Person中的findInSelf方法,就会进入Person中的addFind方法中(方法的实现可以定义到指定的类中)
         v@::表示方法返回值为void,v:void @:id ::方法,没有参数。若加一个sting类型的参数,可写为v@:@,表示该方法有一个参数
         */
    //    第一种方式
      BOOL success = class_addMethod([Person class], @selector(findInSelf), class_getMethodImplementation([ViewController class], @selector(addFind)), "v@:");
    //    第二种方式
    //    BOOL success = class_addMethod([Person class], @selector(findYou), (IMP)findMyYou, "v@:");
        if (success) {
            [p performSelector:@selector(findInSelf)];
    //       [p performSelector:@selector(findYou)];
        }
    }
    //实现函数
    void findMyYou(id self, SEL _cmd) {
        NSLog(@"跑到了实现函数");
    }
    

    替换方法

    - (void)viewDidLoad {
        [super viewDidLoad];
        Person *p = [[Person alloc]init];
    //    替换方法
        /**
         findInSelf:要替换的方法
         jia:新方法
         替换后调用findInSelf方法就会进入,ViewController中的jia方法
         注意:经测试即使Person中没有findInSelfNew方法,调用findInSelfNew后,仍然可以进入jia方法中
         */
    //    IMP _Nullable class_replaceMethod(Class _Nullable cls, SEL _Nonnull name, IMP _Nonnull imp,const char * _Nullable types)
        class_replaceMethod([Person class], @selector(findInSelfNew), class_getMethodImplementation([ViewController class], @selector(jia)), "v@:");
        [p performSelector:@selector(findInSelfNew)];
    }
    

    方法交换

    //交换方法
    - (void)exchangeMethod{
        Method old = class_getInstanceMethod([ViewController class], @selector(viewWillAppear:));//对象方法
        Method new = class_getInstanceMethod([ViewController class], @selector(addFind));//对象方法
        method_exchangeImplementations(old, new);
    //    class_getClassMethod(<#Class  _Nullable __unsafe_unretained cls#>, <#SEL  _Nonnull name#>)//累方法
    }
    

    获取成员变量,属性,以及方法

    //Person成员变量,方法,属性等信息
    - (void)Person{
        unsigned int count;
        //ivar 成员变量
        Ivar *ivars = class_copyIvarList([Person class], &count);
        for (int i = 0; i < count; i ++) {
            Ivar ivar = ivars[I];
            NSLog(@"ivar === %s",ivar_getName(ivar));
        }
    free(ivars);
        //methods 方法
        Method *methods = class_copyMethodList([Person class], &count);
        for (int i = 0; i < count; i ++) {
            Method method  = methods[I];
            NSLog(@"method == %@",NSStringFromSelector(method_getName(method)));
        }
    free(methods);
        //propertys 属性
        objc_property_t *propertys = class_copyPropertyList([Person class], &count);
        for (int i = 0; i < count; i ++) {
            objc_property_t property = propertys[I];
            NSLog(@"property === %s",property_getName(property));
        }
    }
    free(propertys);
    
    打印结果.png

    相关文章

      网友评论

          本文标题:runtime的使用二

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