美文网首页面试
基础问题篇-1. 为什么说Objective-C是一门动态的语言

基础问题篇-1. 为什么说Objective-C是一门动态的语言

作者: Jacob_LJ | 来源:发表于2017-09-12 17:07 被阅读59次

    1. 为什么说Objective-C是一门动态的语言?

    • 什么是动态语言?那相对的静态语言呢?
      • 动态语言(Dynamic Programming Language -动态语言或动态编程语言),是指程序在运行时可以改变其结构
      • 动态类型语言(Dynamically Typed Language),所谓的动态类型语言,是指类型的检查是在运行时做的。
      • 静态语言与静态类型语言与上述描述相反。

    基于上述概念,可知

    静态、动态是相对的,这里动态语言指的是不需要在编译时确定所有的东西(变量数据类型、方法和类),在运行时还可以动态的添加变量、方法和类

    Objective-C 可以通过 Runtime 这个运行时机制,在运行时动态的添加变量、方法、类等,所以说Objective-C 是一门动态的语言。

    我们知道 Objective-C 的运行时本质上是一个库。它负责了 “Objective” 这个部分,因此您所知、所爱的面向对象编程,都是在这里实现的。如果您想要访问里面的函数的话,只需要导入这个库即可:

    #import <objc/runtime.h>
    

    我们可能使用过或了解过很多该库相关的方法,例如:

    • 给分类添加属性
    objc_setAssociatedObject()
    objc_getAssociatedObject()
    
    • Method Swizzling
    method_exchangeImplementations
    
    • 动态继承、交换
      我们可以在运行时创建新的class,这个特性用得不多,但其实它还是很强大的。你能通过它创建新的子类,并添加新的方法,如:Key Value Observing原理,isa指针的变换

    • 消息转发机制

    forwardingTargetForSelector:
    invokeWithTarget:
    

    以上等等其实都都在说明,Objective-C 具有以下动态特性:

    1. 动态类型:
      - 即运行时再决定对象的类型
    1. 动态绑定:
      - 基于[动态类型],在某个实例对象被确定后,其类型便被确定了。该对象对应的属性和响应的消息也被完全确定,这就是动态绑定。
      - [动态绑定]所做的,即是在实例所属类确定后,将某些属性和相应的方法绑定到实例上。这里所指的属性和方法当然包括了原来没有在类中实现的,而是在运行时才需要的新加入的实现
    1. 动态加载:
      - 根据需求加载所需要的资源,这点很容易理解,对于iOS开发来说,基本就是根据不同的机型做适配。最经典的例子就是在Retina设备上加载@2x的图片,而在老一些的普通屏设备上加载原图

    同样将思考的点反过来以下,如果支持上述三个动态特性,那该语言属于动态类型语言吗?

    基础尚算薄弱,还望有识之士能够补充一二,不胜感激!

    ref

    Objective-C 的运行时以及 Swift 的动态性
    Objective-C 与 Runtime:为什么是这样?
    深入Objective-C的动态特性
    (译)Objective-C的动态特性
    Objective-C是一门动态的语言?
    [iOS 知识总结二] 为什么说Objective-C 是一门动态的语言


    文/Jacob_LJ(简书作者)
    PS:如非特别说明,所有文章均为原创作品,著作权归作者所有,转载需联系作者获得授权,并注明出处,所有打赏均归本人所有!

    相关文章

      网友评论

        本文标题:基础问题篇-1. 为什么说Objective-C是一门动态的语言

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