运行时

背景:开发的时候一般用不上,底层框架会用到

运行时常用的面试题

1.什么是运行时
    1>运行时是一套纯C语言的API
   
     2>利用运行时,可以做很多底层的操作, (使用命令行工具  clang -rewirte-objc xxx.m)
              *  比如动态添加成员变量和方法
              * 可以动态交换两个方法的实现(特别是交换系统自带的方法)
            * 还可以获得某个类的成员方法和成员变量
     
     3>编译器最终都会将OC代码转化为运行时
    


2.如何应用运行时
运行时_第1张图片
   1>将某些oc代码转换为运行时代码:探究底层,比如说block的实现原理
   
   2>拦截系统自带的方法调用(imageNamed    viewDidLoad  alloc  都可以)
   
   3>获得某个类的所有成员方法和变量   实现模型和字典自动转换!!!
      
   4>能实现分类 增加属性(每个对象的属性互不干扰)

   5>能实现NSCoding属性的自动归档和自动解档

3.运行时常用的函数
*<objc/runtime.h>
  1>Method class _getClassMethod(Class cls, SEL name);
      获得某个类的类方法
  2>Method class _getInstanceMethod(Class cls, SEL name);
      获得某个类的对象方法
  3>void method_exchangeImplementation(Method m1 .Method m2)
      交换两个方法的实现
  4>void objc_setAssociatedObject (id object,  const  void  *key ,  id  value , objc_AssociationPolicy policy)
      将值value  跟  对象object  关联起来
      
  5> void objc_getAssociatedObject (id object,  const  void  *key)

  6>Ivar  *class_copyIvarList(Class  cls , unsigned  int  *outCount)  
     获得某个类的所有成员变量 (outCount会返回成员变量的总数 )

  7>const  char  *ival_getName(Ivar  v)
     获得某个成员变量的名字

  8> const  char  *ival_getTypeEncoding(Ivar  v)
      获得某个成员变量的类型

*<objc/message>
  1>void objc_msgSend(void)
      给某个对象发送消息
  




来自为知笔记(Wiz)


你可能感兴趣的:(运行时)