前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Runtime常用接口方法汇总

Runtime常用接口方法汇总

作者头像
我只不过是出来写写代码
发布2019-04-02 14:56:17
6720
发布2019-04-02 14:56:17
举报
文章被收录于专栏:我只不过是出来写写iOS

Runtime简称运行时,就是系统在运行时一些机制,其中最主要的是消息机制。 Runtime基本是用C和汇编写的,从而有了动态系统的高效。

C语言:

  1. 函数的调用在编译的时候就决定调用哪个函数,编译完成之后直接顺序执行,无任何二义性。
  2. C语言在编译阶段调用未实现的函数就会报错

Objective-C:

函数的调用成为消息发送objc_msgSend,属于动态调用过程。 在编译时不能决定调用哪个函数(事实证明,在编译阶段,OC可以调用任何函数,即使这个函数并未实现,只要声明过就不会报错) Objective-C从三种不同的层级上与Runtime系统进行交互,分别是:

  1. 通过 Objective-C 源代码
  2. 通过 Foundation 框架的NSObject类定义的方法
  3. 通过对 runtime 函数的直接调用

通过 Objective-C 源代码。

多数情况我们只需要编写Objective-C代码即可,Runtime系统自动在幕后搞定一切,编译器会将 OC 代码转换成运行时代码,在运行时确定数据结构和函数。

通过 Foundation 框架的NSObject类定义的方法。

在cocoa程序中绝大部分类都是 NSObject 类的子类,所以都继承了 NSObject 的行为,而在 NSObject 类中仅仅定义了完成部分事情的模板,但没有提供所需要的代码。例如 -description 方法,该方法返回类内容的字符串,主要用来调试程序。 在NSObject类中,提供了以下方法可以从 Runtime 系统中获取信息: -class方法返回对象的类; -isKindOfClass:-isMemberOfClass: 方法检查对象是否存在于指定的类的继承体系中(是否是其子类或者父类或者当前类的成员变量); -respondsToSelector: 检查对象能否响应指定的消息; -conformsToProtocol:检查对象是否实现了指定协议类的方法; -methodForSelector: 返回指定方法实现的地址。

通过对 runtime 函数的直接调用

获取指定类

代码语言:javascript
复制
Class exampleClass = object_getClass([Example class]);

自定义selector方法

代码语言:javascript
复制
SEL testSEL = @selector(customSelector);

获取类方法

代码语言:javascript
复制
Method testMethod = Method class_getClassMethod(Class exampleClass , SEL testSEL);

获取实例方法

代码语言:javascript
复制
Method class_getInstanceMethod(Class exampleClass , SEL testSEL)

添加方法

代码语言:javascript
复制
BOOL addSucc = class_addMethod(exampleClass, testSEL, method_getImplementation(newMethod), method_getTypeEncoding(newMethod));

替换方法

代码语言:javascript
复制
class_replaceMethod(exampleClass, cusSEL, method_getImplementation(oriMethod), method_getTypeEncoding(oriMethod));

交叉互换方法

代码语言:javascript
复制
method_exchangeImplementations(oriMethod, newMethod);

获取一个类的属性列表,返回数组格式

代码语言:javascript
复制
objc_property_t *propertyList = class_copyPropertyList([self class], &count);

获取一个类的方法列表

代码语言:javascript
复制
Method *methodList = class_copyMethodList([self class], &count);

获取一个类的成员变量列表

代码语言:javascript
复制
Ivar *ivarList = class_copyIvarList([self class], &count);

获取成员变量的名字

代码语言:javascript
复制
const char *ivar_getName(Ivar v)

获取成员变量的类型

代码语言:javascript
复制
const char *ivar_getTypeEndcoding(Ivar v)

获取一个类的协议列表,返回为数组

代码语言:javascript
复制
__unsafe_unretained Protocol **protocolList = class_copyProtocolList([self class], &count);

set方法

代码语言:javascript
复制
void objc_setAssociatedObject(id object , const void *key ,id value ,objc_AssociationPolicy policy)
//将值value 跟对象object 关联起来(将值value 存储到对象object 中)
//object参数表示指定对象设置属性
//key参数:一个属性对应一个key,将来可以通过key取出这个存储的值,key 可以是任何类型
//value参数:为属性设置的值
//policy参数:设置存储策略(assign、strong、weak等)

利用参数key 将对象object中存储的对应值取出来

代码语言:javascript
复制
id objc_getAssociatedObject(id object , const void *key)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.07.11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C语言:
  • Objective-C:
    • 通过 Objective-C 源代码。
      • 通过 Foundation 框架的NSObject类定义的方法。
        • 通过对 runtime 函数的直接调用
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档