OC动态特性

作者: 衹氏 | 来源:发表于2016-05-03 21:10 被阅读910次

OC常见的动态特性分为:动态类型(Dynamic typing),动态绑定(Dynamic binding),动态加载(Dynamic loading)。

所谓运行时特性即只有在运行时才会进行具体准确识别的特性。

OC在底层提供了相当丰富的运行时特性eg:枚举类属性方法、获取方法实现等。

(一)动态类型:运行(时)后再决定对象的真正类型。 指代obj对象在内容方面具有(指向)某个具体的(子)引用对象的内容的地址(地址复制)即具有了内容对象但若想访问其下的方法必须进行强制类型转换。eg:id类型即通用对象类,id指针可指向任何对象,任何对象都可以写入id指针中,通过introspection方式确定id指针实际所属类。

id obj = someInstance;

if ([obj isKindOfClass:someClass]){someClass *classSpecifiedInstance = (someClass *)obj;}

introspection自省方法:1)-isKindOfClass:确定某个对象是某个类本身的成员 2)-isMemberOfClass:确定某个对象是某个类或其子类的成员;

(二)动态绑定

动态绑定是基于动态类型的,在某个实例对象被确定后,其类型便被确定了。其确定类型下对应的属性和响应的消息(消息的响应)也完全确定。传统函数一般在编译时就已经把参数信息和函数的实现打包到编译后的源码二进制文件中,OC中并没有将方法名与方法参数信息编译进入二进制文件中,运行时oc中使用消息机制调用实例方法即向该实例指针发送消息,实例指针在收到消息后,从自身的实现文件中寻找响应消息的方法。

动态绑定即在实例对象所真正归属类确定之后,将该类下某些属性和相应的方法绑定到真正的类的实例对象上。属性和方法既包括类中实现的实现方法(头文件中可编译的声明方法)也包括非类中实现方法(非头文件声明的不可编译方法,开始时计算机编译不出这些方法,不知道这些方法的存在,只有在正式运行时才会根据需要新加入实现方法)。

在Cocoa层,通过向NSObject对象发送响应SEL判断方法:-respondsToSelector:/-instancesRespondToSelector:确定NSObject对象是否对某个SEL做出响应。

OC消息转发机制被触发之前,对应类下的+resolveClassMethod:和+resolveInstanceMethod:将会被调用,此时返回yes动态地向类或者实例添加对象尚未解读的新方法,也即类的实现是动态绑定。

void dynamicMethodIMP(id self, SEL _cmd)

{// implementation ....}//自定义“尚未解读”实现方法

OC中,消息转发机制被触发之前调用

+ (BOOL) resolveInstanceMethod:(SEL)aSEL  //参数aSEL:自定义“尚未解读”实现方法

{ if (aSEL == @selector(resolveThisMethodDynamically))

{//resolveThisMethodDynamically待解读方法效果等同

//向[self class](相应的接受者对象)中添加返回值为void的实现方法aSEL,类型SEL,具体内容为dynamicMethodIMP

class_addMethod([self class], aSEL, (IMP) dynamicMethodIMP, “v@:”);

return YES;

}

return [super resolveInstanceMethod:aSel];

}

注意:调用class_addMethod添加实现方法;调用method_setImplementation替换实现方法。

(三)动态加载

根据对资源的实际需求进而加载相应的资源,可实现内存的优化eg:不同机型适配(在Retina显示屏机型设备上加载@2x图片,在一些普通屏机型设备上加载@1x原图。)。

相关文章

  • OC动态特性

    OC常见的动态特性分为:动态类型(Dynamic typing),动态绑定(Dynamic binding),动态...

  • oc的运行期环境(runtime)

    oc语言的动态特性 oc语言的动态特性来自ObjC Runtime ,其实是一个 runtime 库,基本上用 C...

  • 我理解的runtime

    OC Runtime 对OC的理解与特性 OC是一门面向对象语言,既有静态语言的特性(C++),又有动态语言的特性...

  • 面试总结

    1、OC是一门面向对象语言,但是它既有静态语言的特性,又有动态语言的效率。OC中的动态特性体现在OC中的RunLo...

  • 动态添加属性-Associated Object

    前言 从今天开始,我们将要开始逐步接近OC的动态特性,慢慢揭开OC底层runtime系统的神秘面纱,超强的动态特性...

  • 面试技巧攻克-OC高级特性

    一、runtime机制 1、什么是runtime? runtime是OC的重要特性,使得OC语言具有动态的特性,动...

  • 面试总结

    OC的理解与特性 . OC是一门面向对象的语言,三大特性:封装 继承 多态。静态语言特性(C++),动态语言的效率...

  • iOS 面试集锦

    1. OC 语言的优缺点 优点: category posing 动态特性runtime: 函数实现 IMP 动态...

  • 问题[○○○]:我们说的oc是动态运行时语言是什么意思?

    OC的动态运行时,是指OC具有动态类型和动态绑定的特性。动态类型能使程序直到执行时才确定对象的所属类, 其具体引用...

  • 各种Hook框架的理解

    非越狱环境: OC的runtime特性,来动态替换修改oc类的方法,但仅能针对OC语言 fishhook fac...

网友评论

    本文标题:OC动态特性

    本文链接:https://www.haomeiwen.com/subject/zrhkrttx.html