Runtime常用接口方法汇总
Runtime简称运行时,就是系统在运行时一些机制,其中最主要的是消息机制。 Runtime基本是用C和汇编写的,从而有了动态系统的高效。
C语言:
- 函数的调用在编译的时候就决定调用哪个函数,编译完成之后直接顺序执行,无任何二义性。
- C语言在编译阶段调用未实现的函数就会报错
Objective-C:
函数的调用成为消息发送objc_msgSend,属于动态调用过程。 在编译时不能决定调用哪个函数(事实证明,在编译阶段,OC可以调用任何函数,即使这个函数并未实现,只要声明过就不会报错) Objective-C从三种不同的层级上与Runtime系统进行交互,分别是:
- 通过 Objective-C 源代码
- 通过 Foundation 框架的NSObject类定义的方法
- 通过对 runtime 函数的直接调用
通过 Objective-C 源代码。
多数情况我们只需要编写Objective-C代码即可,Runtime系统自动在幕后搞定一切,编译器会将 OC 代码转换成运行时代码,在运行时确定数据结构和函数。
通过 Foundation 框架的NSObject类定义的方法。
在cocoa程序中绝大部分类都是 NSObject 类的子类,所以都继承了 NSObject 的行为,而在 NSObject 类中仅仅定义了完成部分事情的模板,但没有提供所需要的代码。例如 -description
方法,该方法返回类内容的字符串,主要用来调试程序。
在NSObject类中,提供了以下方法可以从 Runtime 系统中获取信息:
-class
方法返回对象的类;
-isKindOfClass:
和 -isMemberOfClass:
方法检查对象是否存在于指定的类的继承体系中(是否是其子类或者父类或者当前类的成员变量);
-respondsToSelector:
检查对象能否响应指定的消息;
-conformsToProtocol:
检查对象是否实现了指定协议类的方法;
-methodForSelector:
返回指定方法实现的地址。
通过对 runtime 函数的直接调用
获取指定类
Class exampleClass = object_getClass([Example class]);
自定义selector方法
SEL testSEL = @selector(customSelector);
获取类方法
Method testMethod = Method class_getClassMethod(Class exampleClass , SEL testSEL);
获取实例方法
Method class_getInstanceMethod(Class exampleClass , SEL testSEL)
添加方法
BOOL addSucc = class_addMethod(exampleClass, testSEL, method_getImplementation(newMethod), method_getTypeEncoding(newMethod));
替换方法
class_replaceMethod(exampleClass, cusSEL, method_getImplementation(oriMethod), method_getTypeEncoding(oriMethod));
交叉互换方法
method_exchangeImplementations(oriMethod, newMethod);
获取一个类的属性列表,返回数组格式
objc_property_t *propertyList = class_copyPropertyList([self class], &count);
获取一个类的方法列表
Method *methodList = class_copyMethodList([self class], &count);
获取一个类的成员变量列表
Ivar *ivarList = class_copyIvarList([self class], &count);
获取成员变量的名字
const char *ivar_getName(Ivar v)
获取成员变量的类型
const char *ivar_getTypeEndcoding(Ivar v)
获取一个类的协议列表,返回为数组
__unsafe_unretained Protocol **protocolList = class_copyProtocolList([self class], &count);
set方法
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中存储的对应值取出来
id objc_getAssociatedObject(id object , const void *key)
- python爬虫入门(六) Scrapy框架之原理介绍
- lambda表达式杂谈
- python爬虫入门(七)Scrapy框架之Spider类
- python爬虫入门(八)Scrapy框架之CrawlSpider类
- python爬虫入门(九)Scrapy框架之数据库保存
- Numpy 修炼之道(1) —— 什么是 Numpy
- TensorFlow修炼之道(3)——计算图和会话(Graph&Session)
- 1.python简介
- 《Python自然语言处理》答案第三章
- 2.python数据类型
- Miller Rabin算法详解
- 3.python文件操作
- TensorFlow修炼之道(2)——变量(Variable)
- 4.python迭代器生成器装饰器
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [Hei.Captcha] Asp.Net Core 跨平台图形验证码实现
- Asp.Net Core 3.1 获取不到Post、Put请求的内容 System.NotSupportedException Specified method is not supported
- OpenGL ES for Android 播放视频
- Centos 7 在线安装 离线安装 最新 Docker-compose 的正确姿势 实践笔记
- OpenGL ES for Android 视频缩放、旋转、平移
- OpenGL ES for Android 相机预览
- OpenGL ES for Android 相机预览适配不同分辨率的手机
- Flutter Widgets 之 Container
- Flutter Widgets 之 Row和Column
- Flutter Widgets 之 SafeArea
- Flutter Widgets 之 Wrap
- Flutter Widgets 之 Expanded和Flexible
- 可能是Asp.net Core On host、 docker、kubernetes(K8s) 配置读取的最佳实践
- Flutter Widgets 之 AnimatedContainer
- Flutter Widgets 之 Opacity 和AnimatedOpacity