博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS | Runtime应用
阅读量:4964 次
发布时间:2019-06-12

本文共 2176 字,大约阅读时间需要 7 分钟。

runtime,简称运行时。最主要的是消息机制。对于C语言,函数的调用在编译的时候会决定调用哪个函数,编译完成之后直接顺序执行。OC的函数调用称为消息发送,属于动态调用过程。在编译的时候并不能决定真正调用哪个函数(即使这个函数并未实现,只要申明过就不会报错,而C语言在编译阶段就会报错),只有在真正运行的时候才会根据函数的名称找 到对应的函数来调用。

消息发送机制

OC语法中调用方法时,在运行时会变成objc_msgSend函数,我们可以通过运行时去直接调用方法,包括私有方法。

objc_msgSend函数首先会找到方法对应的方法实现,然后将消息接受者的对象以及方法中指定的参数传给所找到的方法实现,最后将方法实现的返回值作为函数的返回值返回。
首先要到build Settings关闭 strict checking,否则会报错。
1240
1240

交换方法

对象调用方法,先会到类中去搜寻方法列表,如果没有找到就去父类找,如果一直没有找到就会报出unrecognize selector错误。我们可以通过调用A方法,实现B方法。

1240
1240
注意class_getClassMethod和class_getInstanceMethod的区别,一个是获取类方法,一个是获取实例方法。

获取实例变量

获取类中的所有实例变量。

//类中实例变量的数量。函数返回一个数组,还有一个返回值通过传地址进去返回。 unsigned int ivarCount;Ivar* ivarList = class_copyIvarList([Person class], &ivarCount); //遍历返回的实例变量数组for (int i = 0; i < ivarCount; i++) {//打印实例变量名NSLog(@"%s",ivar_getName(ivarList[i])); }
获取方法列表

获取类中的所有方法,包括属性的setter和getter方法。

unsigned int outCount;Method *methodList = class_copyMethodList([Person class], &outCount); for(inti=0;i
动态创建类,并添加实例变量和方法(KVO用该方法创建子类)
//分别为 继承父类的类名 ,类名 Class myClass = objc_allocateClassPair([NSObject class], "City", 0); //添加实例变量,分别为变量所需类名,变量名,变量类型大小,变量类型编码BOOL flag = class_addIvar([myClass class], "_name", sizeof(NSString *), 0, "@" );if (flag) {//如果添加成功,使用kvc为变量赋值id newCity = [[myClass alloc]init];[newCity setValue:@"深圳" forKey:@"_name"]; //读取变量值NSLog(@"%@",[newCity valueForKey:@"_name"]);}//添加方法,方法所属类,方法选择器,方法实现,方法实现的类型编码 //类型编码要参考官方文档,v标识void返回类型 , //调用方法时,默认传入 调用者对象和方法选择器:对应 @: //第三个参数为NSString对象,所以用 @,综合为 v@:@flag = class_addMethod([myClass class], @selector(aMethodSel:),(IMP)aMethodImp,"v@:"); //调用方法id newCity = [[myClass alloc]init];[newCity aMethodSel:@"添加方法"];}//方法实现,方法选择器最终找到方法实现并执行里面的代码 void aMethodImp(id self,SEL sel, NSString *name){NSLog(@"%s methodname=%@",__func__,name); }//方法选择器,类似于声明,里面的内容并不会执行 - (void)aMethodSel:(NSString *)name{NSLog(@"%s selname=%@",__func__,name); }
关联对象
///分类中定义一个url属性,重写set,get - (void)setUrl:(NSString *)url{/*** 关联属性的对象属性的key值,这个值名字可以随便设,和取值时候保持一致就行 属性的value值//内存管理策略,如copy,assign等*/objc_setAssociatedObject(self, "url", url, OBJC_ASSOCIATION_COPY_NONATOMIC); }- (NSString *)url{//根据key值取出保存的value值return objc_getAssociatedObject(self, "url");}}

转载于:https://www.cnblogs.com/JanChuJun/p/10102236.html

你可能感兴趣的文章
IIS负载均衡-Application Request Route详解第六篇:使用失败请求跟踪规则来诊断ARR...
查看>>
管理信息系统 第三部分 作业
查看>>
[Leetcode Week13]Search a 2D Matrix
查看>>
查看端口占用cmd命令
查看>>
2019.01.17王苛震作业
查看>>
清除浮动
查看>>
PayPal(贝宝)支付接口、文档、IPN
查看>>
ORACLE 10G R2_执行计划中cost cardinality bytes cpu_cost io_cost解释
查看>>
本地存储
查看>>
MP3的播放与停止
查看>>
牛客(59)按之字形顺序打印二叉树
查看>>
JavaScript 图表库 xCharts
查看>>
Android项目的目录结构
查看>>
C++中“引用”的底层实现
查看>>
Spring Cloud与微服务构建:微服务简介
查看>>
Babel 是干什么的
查看>>
cocos2dx-3.0(8)------Label、LabelTTF、LabelAtlas、LabelBMFont使用之法
查看>>
CODE[VS] 1842 递归第一次
查看>>
20180418小测
查看>>
数字三角形
查看>>