背景:开发的时候一般用不上,底层框架会用到
运行时常用的面试题
1.什么是运行时
1>运行时是一套纯C语言的API
2>利用运行时,可以做很多底层的操作, (使用命令行工具 clang -rewirte-objc xxx.m)
*
比如动态添加成员变量和方法
* 可以动态交换两个方法的实现(特别是交换系统自带的方法)
* 还可以获得某个类的成员方法和成员变量
3>编译器最终都会将OC代码转化为运行时
2.如何应用运行时
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)