我的runtime理解和用法

news/2024/7/7 20:52:32 标签: runtime, c/c++

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)步操作

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

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

转载于:https://www.cnblogs.com/lvjun70/p/5255061.html


http://www.niftyadmin.cn/n/1119908.html

相关文章

.NET Core 2.0 开源Office组件 NPOI

前言 去年 12 月&#xff0c;我移植了大家所熟知 NPOI 到 .NET Core 版本&#xff0c;这里是当时发的博客&#xff0c;当时得到了很多同学的支持&#xff0c;社区反应也很好&#xff0c;在这里非常感谢当时推荐的朋友们。 去年的那个版本是针对于 .NET Core 1.0 的&#xff0c;…

OCP-1Z0-051 补充题库 第43题 子查询

一、原题 Exhibit contains the structure of PRODUCTS table: Evaluate the following query: What would be the outcome of executing the above SQL statement? A. It produces an error B. It shows the names of products whose list price is the second h…

解决“此电脑上没有安装True Speech声音×××”的方法

解决“此电脑上没有安装True Speech声音”的方法很多朋友也许都和我一样同学学习别人的视频来了解和掌握从书本上没有学到的东西。并且很多视频都是屏幕录像专家录制的。当播放时出现“此电脑上没有True Speech声音&#xff0c;无法播放此文件中的声音&#xff0c;可能是你的操…

禅道 bug指向为数字问题解决过程

browse.html.php <td <?php if($bug->assignedTo $this->app->user->account) echo class"red";?>><?php echo zget($users, $bug->assignedTo, $bug->assignedTo);?></td>转载于:https://www.cnblogs.com/cb168/p/5…

列举你能想到的UNIX信号,并说明信号用途

信号是一种软中断&#xff0c;是一种处理异步事件的方法。一般来说&#xff0c;操作系统都支持许多信号。尤其是UNIX&#xff0c;比较重要应用程序一般都会处理信号。 UNIX定义了许多信号&#xff0c;比如SIGINT表示中断字符信号&#xff0c;也就是CtrlC的信号&#xff0c;SIG…

MailBee.NET Objects退回邮件教程(一):SMTP部分

2019独角兽企业重金招聘Python工程师标准>>> MailBee.NET Objects是一款为创建、发送、接收以及处理电子邮件而设计的健壮、功能丰富的.NET控件。几行代码便可为应用程序添加E-Mail支持&#xff0c;简单高效。具备“必需”以及独特的功能&#xff0c;这些控件帮助开…

OCP-1Z0-051 补充题库 第44题 NATURAL JOIN自然连接

一、原题 View the Exhibits and examine the structures of the PRODUCTS, SALES, and CUSTOMERS tables.You issue the following query: SQL>SELECT p.prod_id,prod_name,prod_list_price, quantity_sold,cust_last_name FROM products p NATURAL JOIN sal…

easyui datagrid 前台分页

核心方法 //分页data function pagerFilter(data, pagegrid) {if (typeof data.length number && typeof data.splice function) { // is arraydata {total: data.length,rows: data}}var dg pagegrid || $(this);var opts dg.datagrid(options);var pager dg.da…