1.iOS Runtimeç解
2.iOS Runtime详解
iOS Runtimeç解
runtime
æ¦è¿°: runtimeåå«è¿è¡æ¶ï¼æ¯ä¸å¥åºå±Cè¯è¨APIï¼æ¯iOSç³»ç»çæ ¸å¿ä¹ä¸ãå¼åè å¨ç¼ç è¿ç¨ä¸ï¼å¯ä»¥ç»ä»»æä¸ä¸ªå¯¹è±¡åéæ¶æ¯ï¼å¨ç¼è¯é¶æ®µåªæ¯ç¡®å®äºè¦åæ¥åçåéè¿æ¡æ¶æ¯ï¼èæ¥åè å¦ä½ååºåå¤çè¿æ¡æ¶æ¯ï¼å°±è¦çè¿è¡æ¶æ¥å³å®äº
Cè¯è¨ä¸ï¼å¨ç¼è¯å¨å°±ç¡®å®è¦è°ç¨åªä¸ªå½æ°ï¼èOCçå½æ°ï¼å±äºå¨æè°ç¨è¿ç¨ï¼å¨ç¼è¯å¨å¹¶ä¸è½çæ£å³å®è°ç¨åªä¸ªå½æ°ï¼åªæå¨çæ£çè¿è¡æ¶æä¼æ ¹æ®å½æ°çå称æ¾å°å¯¹åºçå½æ°æ¥è°ç¨ãOCæ¯ä¸ä¸ªå¨æè¯è¨ï¼è¿æå³çå®ä¸ä» è¦ä¸ä¸ªç¼è¯å¨ï¼ä¹éè¦ä¸ä¸ªè¿è¡æ¶ç³»ç»æ¥å¨æå建类å对象ãè¿è¡æ¶æ¯ä¼ éååé
1.æ¶æ¯è½¬å
Runtimeçç¹æ§ä¸»è¦æ¯æ¶æ¯ä¼ éï¼å¦ææ¶æ¯å¨å¯¹è±¡ä¸æ¾ä¸å°ï¼å°±è¿è¡è½¬åãObjective-Cæ¯ä¸ä¸ªå¨æè¯è¨ï¼è¿æå³çå®ä¸ä» éè¦ä¸ä¸ªç¼è¯å¨ï¼ä¹éè¦ä¸ä¸ªè¿è¡æ¶ç³»ç»æ¥å¨æå建类å对象ãè¿è¡æ¶æ¯ä¼ éå转åãRuntimeçæ ¸å¿æ¯æ¶æ¯ä¼ éã
(1)æ¶æ¯ä¼ éçè¿ç¨
ä¸ä¸ªå¯¹è±¡çæ¹æ³[obj test],源码ç¼è¯å¨è½¬ææ¶æ¯åéobjc_msgSend(obj,test),Runtimeæ§è¡çæµç¨æ¯è¿æ ·ç
a.é¦å éè¿objçisaæéæ¾å°å®çclass
b.å¨classçmethod listæ¾test
c.å¦æclassä¸æ²¡æ¾å°testï¼ç»§ç»å¾å®çsuperclassä¸æ¾
d.ä¸æ¦æ¾å°testè¿ä¸ªå½æ°ï¼å°±å»æ§è¡å®çIMP
ç±äºæçé®é¢ï¼æ¯ä¸ªæ¶æ¯é½éåä¸æ¬¡objc_method_list并ä¸åçï¼æ以éè¦æç»å¸¸è¢«è°ç¨çå½æ°ç¼åä¸æ¥ï¼å»æé«å½æ°æ¥è¯¢çæçãè¿ä¹å°±æ¯objc_classä¸å¦ä¸ä¸ªéè¦çæåobjc_cacheåçäºæ ãæ¾å°testä¹åï¼å°testçmethod_nameä½ä¸ºkeyï¼method_impä½ä¸ºvalueãå½å次æ¶å°testæ¶æ¯çæ¶åï¼å¯ä»¥ç´æ¥å¨cacheéæ¾ã
类对象ï¼objc_classï¼
Objective-Cç±»æ¯ç±Classç±»åæ¥è¡¨ç¤ºçï¼å®å®é ä¸æ¯ä¸ä¸ªæåobjc_classç»æä½çæéãstruct objc_classç»æä½éé¢å®ä¹äºå¾å¤åéãç»æä½éä¿åäºæåç¶ç±»çæéãç±»çååï¼nameï¼ãçæ¬ãå®ä¾åéå表ï¼ivarsï¼ãæ¹æ³å表ï¼methodListsï¼ãç¼åï¼cacheï¼ãéµå®çåè®®å表ï¼protocolsï¼,ç±æ¤å¯è§ï¼ç±»å¯¹è±¡å°±æ¯ä¸ä¸ªç»æä½struct objc_classï¼è¿ä¸ªç»æä½åæ¾çæ°æ®å°±æ¯å æ°æ®
ç解Runtimeå°±æ¯ç解iOSå¨è¿è¡æ¶ä»çæ°æ®åå¨ä»¥åä»çç±»ãå®ä¾ã类对象ãå 类她们ä¹é´çå ³ç³»åä½ç¨ã
(2)æ¶æ¯è½¬åæºå¶
å½æ ¹å°åºï¼Objective-Cä¸ææçæ¹æ³è°ç¨æ¬è´¨å°±æ¯å对象åéæ¶æ¯
1.ç±»ä¸å建æ¹æ³-(void)test
2.iOSç³»ç»ä¸ºè¿ä¸ªæ¹æ³å建ä¸ä¸ªç¼å·ï¼SEL(test)并添å å°æ¹æ³å表éé¢
3.å½è°ç¨è¿ä¸ªæ¹æ³çæ¶åç³»ç»å»æ¹æ³å表éæ¥æ¾è¿ä¸ªæ¹æ³ï¼æ¾å°äºå°±æ§è¡
æ以ï¼è°ç¨ä¸ä¸ªæ¹æ³å°±ä¼è¿è¡ä¸æ¬¡åéæ¶æ¯ä¹å°±æ¯å¨è¿ä¸ªç±»çæ¹æ³å表éæ¾ï¼å¦æå¨è¯¥ç±»ä¸æ¾ä¸å°å°±å°è¯¥ç±»çç¶ç±»éæ¾ï¼å¦æç¶ç±»è¿æ¾ä¸å°å°±ä¸ç´æç´¢å°ç»§æ¿æ çæ ¹é¨ï¼å¦ææ¾ä¸å°æè æ¶æ¯è½¬åä¸æåé£å°±ä¼æ¥unrecognized selectoréã
1.å¨ææ¹æ³è§£æ
Objective-Cè¿è¡æ¶ä¼è°ç¨+resolveInstanceMethod:æè +resolveClassMethod:è®©ä½ ææºä¼æä¾ä¸ä¸ªå½æ°å®ç°ï¼å¦æä½ æ·»å äºå½æ°å¹¶ä¸è¿åYESï¼é£ä¹è¿è¡æ¶å°±ä¼éæ°å¯å¨ä¸æ¬¡æ¶æ¯åéçè¿ç¨ãå¦ä¸å¾ï¼
è½ç¶æ²¡æfoo:çå®ç°å½æ°ï¼ä½æ¯éè¿class_addMethod()å¨ææ·»å äºfooMethodå½æ°ï¼å¹¶æ§è¡äºè¿ä¸ªå½æ°å¹¶ä¸æå°æåãå¦æresloveè¿åNOè¿è¡æ¶å°±ä¼ç§»å°ä¸ä¸æ¥:forwardingTargetSelector
2.ç´æ¥æ¶æ¯è½¬å
å¦æç®æ 对象å®ç°äºforwardingTargetSelectorï¼Runtimeè¿æ¶å°±ä¼è°ç¨è¿ä¸ªæ¹æ³ï¼ç»ä½ æè¿ä¸ªæ¶æ¯è½¬åç»å ¶ä»å¯¹è±¡çæºä¼
ä»å¾ä¸å¯ä»¥çåºæ们éè¿forwardingTargetForSelectoræ¹æ³å°å½åç±»çæ¹æ³è½¬ç»Fatherç±»å®ç°äºï¼æå°æåã
3.å®æ´æ¶æ¯è½¬å
å¦æå¨ä¸ä¸æ¥è¿ä¸è½å¤çæªç¥æ¶æ¯ï¼é£å¯ä¸è½åçå°±æ¯å¯å¨æ¶æ¯è½¬åæºå¶ãé¦å å®ä¼åémethodSignatureForSelectoræ¶æ¯è·å¾å½æ°çåæ°åè¿åå¼ç±»åãå¦æmethodSignatureForSelectorè¿ånilï¼Runtimeåä¼ååºdoesNotRecognizeSelectorãå¦æè¿åä¸ä¸ªç¾åå½æ°ï¼Runtimeå°±ä¼å建ä¸ä¸ªNSInvocation对象并åéforwardInvocationæ¶æ¯ç»ç®æ 对象ã
Runtimeçå®é åºç¨
1.使ç¨Runtime交æ¢æ¹æ³
2.å¨ææ·»å æ¹æ³ï¼ç®åä¸æ¯å¾æï¼
3.ç»å类添å å±æ§
4.æ¶æ¯è½¬å(çæ´æ°)解å³Bug(JSPatch)
iOS Runtime详解
Objective-C Runtime的世界深藏了高效的消息传递机制和动态扩展的能力。它以C和汇编的源码形式构建,为iOS .5+的源码位程序提供了强大的扩展支持。日常开发中,源码我们主要依赖官方API,源码但理解Runtime的源码glide源码修改底层运作有助于我们更好地利用它。
首先,源码理解类、源码实例和元类是源码关键。类由objc_class表示,源码作为单例的源码元类,isa指针揭示了类的源码本质。实例(objc_object)是源码declicker 源码类的具体实例,isa指向其对应的源码类。在消息传递中,源码我们通过isa查找类,遍历method_list找到目标IMP执行。
objc_msgSend是消息传递的核心,其语法[id self,feignclient源码 SEL op, ...]包含了对象、类和方法的选择。Message接收流程涉及类查找、method_list遍历,遇到未找到的方法时,会进行转发,优化了效率,graykey源码常用方法被缓存在objc_cache中。
元类负责类的创建,类方法和实例方法的管理,形成类的自包含结构。方法的定义包含SEL选择器和IMP实现,如"- (void)caculateWithInt:(NSInteger)num"通过SEL区分不同参数的wowonder 源码版本。
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开发能力。