关于runtime是什么,我这边不做过多解释,百度上一大堆。但是,看看概念,很多人都难以真正理解和使用好runtime。在这里,我从基础使用的观点上,简单粗暴的说下我对runtime的想法。
Class 其实是指向 objc_class 结构体的指针。objc_class 的数据结构如下:
struct objc_class { Class isa OBJC_ISA_AVAILABILITY;#if !__OBJC2__ Class super_class OBJC2_UNAVAILABLE;constchar *name OBJC2_UNAVAILABLE;long version OBJC2_UNAVAILABLE;long info OBJC2_UNAVAILABLE;long instance_size OBJC2_UNAVAILABLE;struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;struct objc_method_list **methodLists OBJC2_UNAVAILABLE;struct objc_cache *cache OBJC2_UNAVAILABLE;struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;#endif} OBJC2_UNAVAILABLE;
runtime的强大之处是,它可以访问所有的函数(不管是不是自定义的函数),我把它比喻成一把万能钥匙,而函数就是一间房间,它可以开启任意一间房子。那就有一个很好的优势了,我们可以随时打开一个房间,并知道房间里面有什么东西,甚至拿到房间的任何东西了。那我们可以干嘛?
1、通过runtime,我们可以知道函数的所有信息,有父类指针、类名、成员变量、方法、缓存以及附属的协议,甚至可以顺着它提供的父类指针访问到其父类的信息。
2、通过runtime,我们获取到成员变量的时候,通过class_copyIvarList,遍历对象属性,来做事情,比如数据和模型的转换,快速归档等。
3、通过runtime,我们获取到了方法,就可以实现方法的交换,也可以添加方法。
当然,还有很多的操作,这边就大概说下比较常用的。一般开发不一定用得上runtime的,但是必要的时候,使用它会省下很多事情。这些需要花更多的时间去琢磨和理解,才能编写出更好的程序。当然,乱使用也会坏事的。
关于runtime的使用场景,我推荐一个博客,大家可以好好理解下。runtime 运行时机制 + 应用场景
网友评论