1.objectivec的runtime到底是什么?
2.iOS Runtime详解
objectivec的runtime到底是什么?
Object-C的运行时本质是libobjc.dylib,这是其核心的实现形式。在这一结构中,关键功能被安置在runtime/目录下。其中,markgc虽然曾经显眼,grepwin源码但已被自动引用计数(ARC)取代,其作用现在仅限于占位。
深入探索runtime列表,我们可以清晰地看到Object-C运行时提供的一系列核心功能。例如,objc_object(id),class,protocol,method,selector,weak,sync,selector-table,RC,load,c 语言基础源码exception以及用于class的selector快速访问的cache。此外,还有几个基于LLVM的基础map,以及NSObject类的实现,这是Object-C中所有类与runtime对接的关键。尽管没有单独实现,但autoreleasepool在NSObject中实现了其功能。
消息转发的核心机制,即Messengers,以纯粹的staple算法源码解析汇编语言编写,其功能强大且复杂,体现了运行时处理消息传递的高效和复杂性。
iOS Runtime详解
Objective-C Runtime的世界深藏了高效的消息传递机制和动态扩展的能力。它以C和汇编的形式构建,为iOS .5+的位程序提供了强大的扩展支持。日常开发中,我们主要依赖官方API,但理解Runtime的底层运作有助于我们更好地利用它。
首先,理解类、linux 内核源码风格实例和元类是关键。类由objc_class表示,作为单例的元类,isa指针揭示了类的本质。实例(objc_object)是类的具体实例,isa指向其对应的类。在消息传递中,我们通过isa查找类,遍历method_list找到目标IMP执行。
objc_msgSend是c 645 协议源码消息传递的核心,其语法[id self, SEL op, ...]包含了对象、类和方法的选择。Message接收流程涉及类查找、method_list遍历,遇到未找到的方法时,会进行转发,优化了效率,常用方法被缓存在objc_cache中。
元类负责类的创建,类方法和实例方法的管理,形成类的自包含结构。方法的定义包含SEL选择器和IMP实现,如"- (void)caculateWithInt:(NSInteger)num"通过SEL区分不同参数的版本。
Category则为类添加动态功能,方法查找包括类自身、继承链,如果未找到则启动转发机制,经历动态方法解析和完整消息转发,为编程提供了灵活性。
例如,通过NSInvocation和MethodSignature,我们可以实现动态解析和消息转发。如ViewController转发foo给Person对象,处理未实现的方法。而关联对象(Objective-C Associated Objects)则通过objc_setAssociatedObject和objc_getAssociatedObject实现属性的动态绑定。
Runtime的魔法,如Method Swizzling,允许在运行时交换方法实现,KVO则通过动态创建子类来实现属性变化的监听。此外,如JSPatch和NSCoding/MJExtension等工具,利用Runtime扩展框架功能,动态修复bug和高效地操作对象属性。
综上所述,Objective-C Runtime是一个强大的工具,它潜藏在iOS开发的幕后,为动态扩展和高效编程提供了无限可能。深入理解并善用Runtime,将极大提升你的iOS开发能力。