zoukankan      html  css  js  c++  java
  • runtime

    runtime(运行时):底层C语言的库,包含很多C语言的API

      OC在运行的过程中,都会被编译器编译成runtime运行时C语言

      clang -rewrite -objc main.m    会生成main.cpp

      作用:

        runtime属于OC的底层实现,可以进行一些非常底层的操作(OC无法实现)

        1.利用runtime,在程序运行的过程中,动态创建一个类

        2.利用runtime,在程序运行过程中,动态的为某个类添加属性/方法,修改属性/方法

        3.遍历一个类的所有成员变量

      怎么用:

        头文件:<objc/runtime>

               class_copyIvarList  拷贝成员列表

               class_getName 通过类获得名称(C语言字符串)

             <objc/message>

               objc_msgSend

               objc_msgSendSuper

        两个常识:

          Method 成员方法(函数)

          Ivar 成员属性(变量)

    应用场景:

    1.归档:

    -(void)encodeWithCode:(NScode*)coder{

      unsigned int count = 0;

      Ivar *ivars = class_copyIvarList([PJXDog class],&count);

       //class_copyIvarList(NSClassFromString(@"PJXDog"),&count);

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

        Ivar ivar = ivars[i];

        const char * name = ivar_getName(ivar);

        NSString *ocName = [NSString stringWithUTF8String:name];

        [coder encodeObject:[self valueForKey:ocName] forKey:ocName]

      }

    }

    -(instancetype)initWithCoder:(NSCoder *)coder{

      if(self = [super init]){

        

     unsigned int count = 0;

      Ivar *ivars = class_copyIvarList([PJXDog class],&count);

       //class_copyIvarList(NSClassFromString(@"PJXDog"),&count);

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

        Ivar ivar = ivars[i];

        const char * name = ivar_getName(ivar);

        NSString *ocName = [NSString stringWithUTF8String:name];

        id value = [coder decoderObjectForKey:ocName];

        [self setValue:value forKey:ocName];

       }

      }

      return self;

    }

    UIKit框架路径: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/UIKit.framework/

    2.KVO底层实现原理:利用runtime运行的时候动态创建一个对象, NSKVONotifing_XX类 类名,重新监测对象的set方法(例如:setAge:),调用method:

      [self willChangeValueForKey:@"age"]

      [self didChangeValueForKey:@:"age"]

  • 相关阅读:
    Java笔记(11):Eclipse使用
    Java笔记(10):面向对象--内部类
    JVM监控及分析(02)
    JVM监控及分析(01)
    Java笔记(09):面向对象--接口
    Java笔记(08):面向对象--抽象类
    Java笔记(07):面向对象--多态
    环境搭建--apache/tomcat/nginx
    Linux监控分析
    HTML语法大全
  • 原文地址:https://www.cnblogs.com/PJXWang/p/5520185.html
Copyright © 2011-2022 走看看