runtime的一些简单用法

先来简单介绍一下runtime:
我们都知道Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理。这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一个方法的实现等。
对于Objective-C来说,这个运行时系统就像一个操作系统一样:它让所有的工作可以正常的运行。这个运行时系统即Objc Runtime。Objc Runtime其实是一个Runtime库,它基本上是用C和汇编写的,这个库使得C语言有了面向对象的能力。
我们编写OC代码时候,编译过程中首先会将OC语言转换成runtime(其实就是C语言) - - >然后再变成汇编 - - >最后成机器码。大概理解一下这个原理即可,下面上代码理解一下runtime的一些简单使用。

  • 通过runtime获取一个对象的所有方法:
    #import "objc/runtime.h" //得加入头文件

      unsigned int methCout_f =0;
      Method* methList_f = class_copyMethodList([test class],&methCout_f);
      for(int i=0;i
  • 通过runtime获取一个对象的所有属性:
    u_int count;
    objc_property_t *properties = class_copyPropertyList([object class], &count);
    NSMutableArray propertiesArray = [NSMutableArray array];
    for (int i = 0; i < count ; i++)
    {
    const char
    propertyName = property_getName(properties[i]);
    [propertiesArray addObject: [NSString stringWithUTF8String: propertyName]];
    }

    free(properties);
    return propertiesArray;
    
  • 关联对象改变获取值的方式
    //设置一个全局静态指针,
    static char * const associativekey = "associativekey";

     UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"what do you want to do?" delegate:self cancelButtonTitle:@"YES" otherButtonTitles:@"cancel", nil];
     [alert show];
    
    __weak typeof(self) weakSelf = self;
    void(^block)(NSInteger) = ^(NSInteger index){
    [weakSelf youWantDoAnyThing];
      NSLog(@"======%d",index);
    };
    objc_setAssociatedObject(alert, associativekey, block, OBJC_ASSOCIATION_COPY);  
     }
    
    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    
    void(^block1)(NSInteger)  = objc_getAssociatedObject(alertView, associativekey);
    
     block1(buttonIndex);
    
    }
    

参考:http://southpeak.github.io/blog/2014/10/25/objective-c-runtime-yun-xing-shi-zhi-lei-yu-dui-xiang/

你可能感兴趣的:(runtime的一些简单用法)