最近面试,总是被问到runtime,又或者问category能否添加属性,虽然之前接触过runtime,但只是简单的拿别人的文件直接copy到工程里面使用,比如“UIbutton+block”,“MJRrefresh”,json解析,等等。。。都没有系统的学习。
正好这个星期,一个朋友问我怎么样在项目里解决“被键盘遮住后视图上移”,并且是全局的,我第一反应就是category,然后又想了一下肯定要用到runtime,因为要给category添加属性,于是乎,我就系统的学习了一下runtime,这是第一篇,参考案例:
Runtime学习与使用(一):为UITextField添加类目实现被键盘遮住后视图上移
Objective-C Method Swizzling 的最佳实践
Objective-C Runtime 消息机制 - 代码背后发生的事情
其实这两篇文章已经把runtime讲解的非常清楚了,首先讲讲什么是ios runtime:
通俗的讲,我自己的理解,就是c语言的实现,其实我们写的oc代码都会被编译器转换成c语言代码,最直接的说明就是你使用clang “clang -rewrite-objc main.m” 编译一个.m文件,得到的结果是
然后打开文件,拉倒最后一行,可以看到
这是什么,这就编译后的代码,抽几个方法来读一下
objc_msgSend:字面意思是“发送消息”,那是干什么的呢,其实我们的oc进行方法的调用等等,其实就是消息的发送实现的,这就是Objective-C Runtime 消息机制。之前我也不是很理解什么叫做消息机制,怎么来通消息的,下面是重点:
runtime中类的定义
runtime中方法的定义
所以其实用c来解释就是一个叫obj_class的结构体在自己的方法列表“objc_method_list”寻找一个method_name叫“sayHello”的方法,然后调用这个“sayHello”的IMP,就是实现,最终我们就完成了这个方法的调用,未完待续...
网友评论