OC运行时--理论篇

1.什么是运行时?

1>概念

    运行时是一套纯C语言的API

2>编译查看

    实际上编译器最终都会将OC代码转为运行时代码(也可手动编译,终端执行:clang -rewrite-objc xxx.m)

3>具体应用:运用运行时函数,实现一些底层的操作,比如

   * 将某些OC代码转为运行时代码:比如查看block的实现原理

   * 拦截系统自带的方法调用,实现Method Swizzling,比如拦截imageNamed,loadView等

   * 可实现字典和模型的自定转换,解决KVC的不足,比如MJExtension框架

   * 可实现分类添加属性,默认分类中property修饰的变量只能生成setter和getter的声明,不能生成其实现

   * 可实现NSCoding的自动归档和自动解档   

 

2.运行时常用的C函数及应用

1>导入函数库<objc/runtime.h>

   * Method class_getClassMethod(Class cls,SEL name)

     获取某个类的类方法

   * Method  class_getInstanceMethod(Class cls,SEL name)

     获取某个类的对象方法

   * void method_exchangeImplementations(Method m1,Method m2);

     交换m1和m2的实现

 

    * void objc_setAssociatedObject(id object, const void *key,id value,objc_AssociationPolicy policy)

     设置对象object中的健值关联(将对象中的value和key关联)

     参数value:将value存储到对象object中,

     参数key:通过key取出存储的value

     参数policy:存储策略(assign,copy,retain)

 

   * id objc_getAssociatedObject (id object, const void *key)   

     通过参数key将对象中存储的值取出来,

 

   * Ivar *class_copyIvarList(Class cls, unsigned int *outCount )

     获取某个类的所有成员变量(outCount表示成员变量总数的地址)

   * const char *var_getName(Ivar v) 

     获取成员变量的名称

   * const char *var_getTypeEncoding(Ivar v)

     获取成员变量的类型

 

   * void free (void *);

     释放内存 

     在C函数中,如果函数名包含copy/create/retain/new等词,最终需要释放资源

 

2><objc/message.h>

   * void objc_msgSend(void)

     给某对象发送某个消息

 

转载于:https://www.cnblogs.com/guozhong/p/4566311.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值