Ios面试复习 --runtime

对于C语言 函数的调用在编译的时候会去决定调用哪个函数

对于OC 属于动态调用过程,在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数名称找到对应的函数

1.发送消息

需要导入头文件<objc/massage.h> 在ios5 以后 苹果不建议开发者直接调用运行时进行开发需要手动打开运行时开发权限

设置开启运行时权限
发送消息

2.利用运行时获得对象内部的属性和方法

<objc/runtime.h>

在runtime中 针对class 除了拿到当前class 所有的方法以外,还有

很多很多方法,这里不做过多的讨论

而利用runtime 拿到类所有的属性,相当于去遍历实例对象的类对象,从类对象中可以轻易得到定义的所有的属性

返回值Ivar存有所有的属性列表

同理可以遍历该对象内所有的方法

返回Method 对象 
查看结果
查看结果

值得一提的是 并没有返回该对象的类方法,也就是说runtime 的 class_copy xxxx系列方法 访问的是该类的类对象内的方法和属性列表,而类方法存放于类对象的元类中

3.Method

Method 是runtime中 用来索引方法的结构体

其中重要的是

SEL : 类成员方法的指针,但不同于C语言中的函数指针,函数指针直接保存了方法的地址,但SEL只是方法编号。

IMP:一个函数指针,保存了方法的地址

所以用来构建Method 

--1.构建类方法Method

Method classFunc = class_getClassMethod(Classcls,@selector(classFunc));

--2.构建实例方法Method

Method func  =class_getInstanceMethod(Classcls,@selector(run));

4.Method swizzling

传说中的ios魔法方法

核心代码其实只有一行

method_exchangeImplementations  既交换两个函数的执行

传进去的都是Method结构体

构建两个Method结构体

而在调用时结果如下

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,820评论 0 9
  • 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的...
    西木阅读 30,709评论 33 466
  • 本文转载自:http://yulingtianxia.com/blog/2014/11/05/objective-...
    ant_flex阅读 4,166评论 0 1
  • Today is Thursday. It was a long way for Pooh to go with ...
    Mr_Oldman阅读 1,371评论 0 0
  • 楔子 明洪武廿年,广信府有一郑氏人家世代耕读为业。家中有一子,性...
    九转惊鸿阅读 1,625评论 0 0