菜鸟成长记-runtime历程

      去面一个有一年以上工作年限的ios开发岗位,如果面试官不是搞技术的,runtime一般问不到,但凡是一个懂技术的面试官面一个一年以上的求职者,runtime运行机制是多半会问到的,runtime非常强大,很多人都败在它魔爪之下,当然我在项目中还没有用到过runtime,一般比较好点的三方库都会使用到runtime,比如:MJExtension、AFNetworking等。

      今天就自己遇到的一个项目中的技术点,学习了一哈runtime,今天就总结一下学习的知识点。

       

1:runtime是一套比较底层的纯c语言API,属于一个c的语言库,oc代码在程序运行过程中,都转化为runtime的c语言代码。从字面理解译为运行时, 所谓运行时,也就是在编译时是不存在的,只是在运行过程中才去确定对象的类型、方法等。利用Runtime机制可以在程序运行时动态修改类、对象中的所有属性、方法等。
   包含头文件:#import <objc/runtime.h>


2:获取一个对象或类中的所有方法: class_copyMethodList([self class], &outCount);

    unsigned int count;

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

     for (unsigned i; i<count; i++) {

         // 获取方法名称,但是类型是一个SEL选择器类型

        SEL methodSEL = method_getName( methods[i]);

        // 需要获取C字符串

        const char *name1 = sel_getName(methodSEL);

        // 将方法名转换成OC字符串

        NSString *methodName = [NSString stringWithUTF8String:name1];  

        // 获取方法的参数列表

        int arguments = method_getNumberOfArguments( methods[i]);

        NSLog(@"方法名:%@, 参数个数:%d", methodName, arguments);

     }

    free(name count);//避免内存泄漏

3:获取一个对象或类中的所有属性名及对应的值:class_copyPropertyList([self class], &count);

   unsigned int count;

    objc_property_t * namecount =   class_copyPropertyList([self class], &count);

    for (unsigned i; i<count; i++) {

       const char * name =   property_getName(namecount[i]);

       // 得到属性名

        NSString *propertyName = [NSString stringWithUTF8String:name];

        NSLog(@"%@",propertyName);

        // 获取属性值

        id propertyValue = [self valueForKey:propertyName];

        NSLog(@"%@",propertyValue);

     }

    free(name count);//避免内存泄漏

4:获取对象的成员变量名称:class_copyIvarList([self class], &count);

      unsigned int count = 0;

       Ivar *ivars = class_copyIvarList([self class], &count);
       for (NSUInteger i = 0; i < count; ++i) {
        Ivar variable = ivars[i];
        const char *name = ivar_getName(variable);
    //得到所有的成员变量名
        NSString *varName = [NSString stringWithUTF8String:name];
 }
    free(ivars);


写到这里只列举了一部分功能,当然我们获取到这么属性名、或变量名有什么作用了,当然是很实用的了,这时候我们可以根据需求,对某个变量名利用kvc技术获取其对应的值,例如:无论是在xib或代码中都无法修改placeholder的颜色及其大小,这是就需要利用runtime机制获取UITextField的所有变量名,看是否存在没有公开的属性或变量名,

_placeholderLabel变量名就是,这时候就会发现确实存在,那么就可以利用kvc机制获取对应的对象 并改变功能


改变UITextField  placeholder文字颜色及大小  kvc机制

  1. [textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];  
  2. [textField setValue:[UIFont boldSystemFontOfSize:16] forKeyPath:@"_placeholderLabel.font"];  



你可能感兴趣的:(菜鸟成长记-runtime历程)