zoukankan      html  css  js  c++  java
  • Runtime — 运行时机制

    • Runtime是一套底层的C语言API(包含强大的C语言数据类型和函数)
    • OC代码都是基于Runtime实现的,即编写的OC代码最终都会转成Runtime的代码,例如:
      HCPerson *person = [HCPerson alloc] init];
      [person setAge:10]; //这句会转换成objc_msgSend(person,@selector(setAge:),20);
      

    Runtime的作用

    • 获取类的私有变量
       #import <objc/runtime.h>
        // Ivar : 成员变量
        unsigned int count = 0;
        // 获得所有的成员变量
        Ivar *ivars = class_copyIvarList([HCPerson class], &count);
        for (int i = 0; i<count; i++) {
            // 取得i位置的成员变量
            Ivar ivar = ivars[i];
            const char *name = ivar_getName(ivar);
            const char *type = ivar_getTypeEncoding(ivar);
            NSLog(@"%d %s %s", i, name, type);
      
        }
      
    • 动态产生类,成员变量和方法
    • 动态修改类,成员变量和方法
    • 对换两个方法的实现(swizzle)
      • 例如:如果想要对iOS7以上和iOS7以下的图片进行适配,不同系统版本显示不同的图片,则可利用swizzle来实现
    • 实现方法:
      1.自定义UIImage的类imageWithName:方法,在该方法内进行系统版本号的判断,来显示不同的图片
      2.将imageWithName:方法和系统的imageNamed:方法进行对换,这样,一旦调用系统的imageNamed:方法,便会执行自定义的imageWithName:方法,进行判断,显示不同的图片
        /**
         *  只要分类被装载到内存中,就会调用1次
         */
        + (void)load
        {
            //获取类方法
            Method otherMehtod = class_getClassMethod(self, @selector(imageWithName:));
            Method originMehtod = class_getClassMethod(self, @selector(imageNamed:));
            // 交换2个方法的实现
            method_exchangeImplementations(otherMehtod, originMehtod);
        }
    
        + (UIImage *)imageWithName:(NSString *)name
        {
            BOOL iOS7 = [[UIDevice currentDevice].systemVersion floatValue] >= 7.0;
            UIImage *image = nil;
            if (iOS7) {
                NSString *newName = [name stringByAppendingString:@"_os7"];
                image = [UIImage imageWithName:newName];
            }
    
            if (image == nil) {
                image = [UIImage imageWithName:name];
            }
            return image;
        }
    
            ```
  • 相关阅读:
    easyui中的combobox小知识点~~
    nodejs+express+mysql 增删改查
    建库和表的脚本.sql
    linux服务器最大连接数
    java高级主题
    java线程池ThreadPoolExecutor
    关于Future
    git rebase
    bash shell for循环
    accept()出的socket不会使用新的端口号
  • 原文地址:https://www.cnblogs.com/hongchong/p/4791263.html
Copyright © 2011-2022 走看看