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"]

原文地址:https://www.cnblogs.com/PJXWang/p/5520185.html