我的runtime理解和用法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的runtime理解和用法相关的知识,希望对你有一定的参考价值。

1.什么是运行时机制

1)运行时机制是比较低层的纯c语言的API文档,属于c语言库,包含了许多底层的c语言API

2)oc中的对象,方法在运行时才知道它时什么类型的,这个类型是动态生成的像KVO的底层实现就是运用了runtime。

3)我们平时编码最终会转换成runtime的c语言代码,runtime算是一个幕后工作者。

像在官方API文档中就有:

[[Person alloc] init]其最后会转换成obje_msgSend("Person", "alloc") ,"init");

2.怎么利用runtime呢?

1)像一些属于oc底层的东西,可以在层运行时动态的创建一个类,即KVO的派生类。

2)在程序运行过层中,动态的为某个类添加属性方法,修改属性值和方法像归档中:字典转模型就是这样的

归档:需要存取数据和读区数据,即存档和解档

例:

需要导入<objc/runtime.h>

- (void)encodeWithCoder:(NSCoder *)encoder

{

  unsigned int count = 0;

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

  // 遍历

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

  {

    // 取出文件对应的成员变量

    Ivar ivar = ivars[i]; 

    // 查看成员变量

    const char name = ivar_getName(ivar);

    // 归档

    NSString *key = [NSString stringWithUTF8String:name];

    id value = [self valueForkey:key];

  }

  // 释放 

  [free ivars];

}

// 解档

- (id)initWithCoder:(NSCoder *)decoder

{

  if (self = [super init])

  {

    unsigned int count = 0; 

    IVar *ivars = class_copyIvarList([LJPerson class], &count);

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

    {

      // 取出文件对应的成员变量

      Ivar ivar = ivars[i];

      // 查看成员变量

      const char *name = ivar_getName(ivar);

 

      NSString *key = [NSString stringWithUTF8String:name];

      id value = [self valueForKey:key];

      [self setValue:value forkey:key];

     }

    return free[ivars];

 }

  return self;

}

3)产看隐藏的成员变量和成员方法

代码实现:#import<objc/runtime.h>

+ (void)initalize

{

  unsigned int count = 0;

  // 拷贝出成员变量列表

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

  // 遍历

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

  {

    // 取出成员变量

    Ivar ivar = *(ivars *i);

    // 打印

    NSLog(@"%s", ivar_getName(ivar));

   }

}

 

关于objc_msgSend:给对象发送消息

massage send 如果找不到相应的对象后序会如何处理

(1)如果用实例对象掉用实例方法,会到实例对象的isa指针指向的对象进行操作。

(2)如果用的是类方法,就会到类对象的isa指针指向的对象中找

如果(1)没有找到就会在相应操作对象的方法liebi如果没有找到相应的对象后,就会到对象中的缓存列表中找。

还没有找到相应的z类核方法则会到父类中执行(1)(2)步操作

依此类推如果没有找到的话,就会掉用拦截

如果在对象方法中还没有找到的话,就会去父类指向的指针中找。

以上是关于我的runtime理解和用法的主要内容,如果未能解决你的问题,请参考以下文章

php中的set_magic_quotes_runtime()作用和用法

RunTime的一些用法

runtime-only和runtime-compiler的区别

runtime-compiler和runtime-only的区别

iOS runtime探究: 从runtime開始深入理解OC消息转发机制

iOS runtime探究: 从runtime开始理解OC的属性property