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动态特性

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