Objective-C具有相当多的动态特性,基本的,也是经常被提到和用到的有动态类型(Dynamic typing),动态绑定(Dynamic binding)和动态加载(Dynamic loading)

一、编译时和运行时

编译时:即编译器对语言的编译阶段,编译时只是对语言进行最基本的检查和报错。包括语法分析、词法分析等等,将程序代码返程成计算机能识别的语言(例如汇编),编译通过并不意味着程序就可以成功运行。

运行时:即程序通过编译这一关后,编译好的代码被装在到内存中这个阶段,这个时候会对具体内存进行检查,而不仅仅对代码的简单扫描分析,此时若出错误程序会崩溃。

可以说编译是一个静态的阶段,类型错误很明显可以直接检查出来,可读性好,而运行时则是动态的阶段,尅是具体与运行环境结合起来。

二、oc语言的动态性

含义:oc语言的动态性主要体现在三个方面:动态类型(Dynamic typing)、动态绑定和动态加载。

1.动态类型

动态类型是指队形指针类型的动态性,具体是指使用id任意类型将对象的类型确定推迟到运行时,由赋给他的对象类型决定对象指针的类型,另外类型确定推迟到运行时之后,可以通过nsobject的isKindofClass方法动态判断对象的最后的类型,(动态类型的识别)也就是说id修饰的对象为动态类型的对象,其他在编译器指明类型的为静态类型对象,通常如果不需要涉及到多态的话还是要尽量使用静态类型(原因上面已经说到:错误可以在编译器体检检查出来,可读性好)

示例:

    // 编译的时候人为obj是一个nsstring对象NSString* obj = [[NSData alloc]init];// 编译通过,运行的时候直接崩溃[obj stringByAppendingString:@"string"];

  通过这里就可以知道,将类型的确定延迟到运行时,体现了oc语言的一种动态性:动态类型。

动态类型的识别方法

(1)首先是Class类型

Class class = [NSObject class]; // 通过类名得到对应的Class动态类型

Class class = [obj class];         // 通过实例对象得到对应的Class动态类型

if([obj1 class] == [obj2 class])  // 判断是不是相同类型的实例

(2)Class动态类型和类名字符串的相互转换

NSClassFromString(@"NSObject");

NSStringFromClass([NSObject class]);

NSStringFromClass([obj class]);

(3) 判断对象是否属于某种动态类型:

- (BOOL)isKindOfClass:class

- (BOOL)  isMemberOfClass:obj

(4)判断类中是否有对应的方法:

- (BOOL)respondsToSelector:(SEL)selector  // 类中是否有这个类方法

- (BOOL)instancesResponsdToSelector:(SEL)selector // 判断对象中是否有这个实例方法

(5)方法名字符串和SEL类型的转换

SEL funcID = @select(func);

SEL funcID = NSSelctorFromString(@"func");

NSString* funcName = NSStringFromSelctor(funcID)

2. 动态绑定

动态绑定指的是方法确定的动态性,具体指的是利用OC的消息传递机制将要执行的方法的确定推迟到运行时,可以动态添加方法,也就是说,一个OC对象是否调用某个方法不是由编译器决定的,而是由运行时决定的;另外关于动态绑定的关键一点是基于消息传递机制的消息转发机制,主要处理应对一些接受者无法处理的消息,此时有机会将消息转发给其他接收者处理,具体见下面介绍。

动态绑定是基于动态类型的,在运行时对象的类型确定后,那么对象的属性和方法也就确定了, 包括类中原来的属性和方法和运行时动态新加入的属性和方法,这也就是所谓的动态绑定。动态绑定的核心就是在运行时动态的为类添加属性和方法,以及方法的最后处理或者转发,主要用到c语言。#include <objc/runtime.h>

消息传递机制

在OC中,方法的调用不再理解为对象调用其方法,而是要理解成对象接收消息,消息的发送采用‘动态绑定’机制,具体会调用哪个方法直到运行时才能确定,确定后才会去执行绑定的代码。方法的调用实际就是告诉对象要干什么,给对象(的指针)传送一个消息,对象为接收者(receiver),调用的方法及其参数即消息(message),给一个对象传消息表达为:[receiver message]; 接受者的类型可以通过动态类型识别于运行时确定。

在消息传递机制中,当开发者编写[receiver message];语句发送消息后,编译器都会将其转换成对应的一条objc_msgSend C语言消息发送原语,具体格式为: 
void objc_msgSend (id self, SEL cmd, ...)

这个原语函数参数可变,第一个参数填入消息的接受者,第二个参数是消息‘选择子’,后面跟着可选的消息的参数。有了这些参数,objc_msgSend就可以通过接受者的的isa指针,到其类对象中的方法列表中以选择子的名称为‘键’寻找对应的方法,找到则转到其实现代码执行,找不到则继续根据继承关系从父类中寻找,如果到了根类还是无法找到对应的方法,说明该接受者对象无法响应该消息,则会触发‘消息转发机制’,给开发者最后一次挽救程序崩溃的机会。

转载于:https://www.cnblogs.com/16zj/p/7693257.html

Objective-C语言的动态性相关推荐

  1. 【Objective-C】Objective-C语言的动态性

    Objective-C语言的动态性主要体现在以下3个方面 (1)动态类型:运行时确定对象的类型. (2)动态绑定:运行时确定对象的方法. (3)动态加载:运行时加载需要的资源或者或代码模块. 一.动态 ...

  2. Python笔记 · Python语言的“动态性”

    尽管对于Python程序员来说已经司空见惯,但是当那些从非动态语言转过来的程序员初次看到形如self.xxx=xxx的语句就是在定义对象属性时往往会感到"离奇":一个未经声明的(类 ...

  3. 【iOS沉思录】Objective-C语言的动态性总结(编译时与运行时)

    编译时与运行时 编译时: 即编译器对语言的编译阶段,编译时只是对语言进行最基本的检查报错,包括词法分析.语法分析等等,将程序代码翻译成计算机能够识别的语言(例如汇编等),编译通过并不意味着程序就可以成 ...

  4. 24、OC语言的动态性学习(Runtime)

    文章目录 一.动态类型 二.动态绑定 三.动态加载 四.消息机制的基本原理 消息查找阶段 动态方法解析 消息转发 消息快转发 消息慢转发 消息发送以及转发机制的总结 重写respondsToSelec ...

  5. Python语言的动态性:运行时动态绑定,删除属性和方法

           Python是动态语言,动态语言是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化.通俗点说就是在运行时代码可以根据某些 ...

  6. Java语言的动态性-invokedynamic

    概述 Invokedynamic指令在JAVA7中就已经提供了,在java7之前,JVM字节码提供了如下4种字节码方法调用指令: 1. Invokevirtual:根据虚方法表调用虚方法. 2. in ...

  7. 初学objective c语言4 dealloc

    #import <foundation/foudation.h> #import "Init.h" #import "Eyes.h" int mai ...

  8. java executor_Java 动态语言支持

    JDK6.0之后提供了脚本引擎功能,让我们可以执行某些脚本语言,特别是javascript(javascript是一门解释性语言,动态性非常好),让JAVA的动态性得到更充分的体现,某些时候可以更加灵 ...

  9. 【Groovy】Groovy 动态语言特性 ( Groovy 中函数实参自动类型推断 | 函数动态参数注意事项 )

    文章目录 前言 一.Groovy 中函数实参自动类型推断 二.函数动态参数注意事项 三.完整代码示例 前言 Groovy 是动态语言 , Java 是静态语言 ; 本篇博客讨论 Groovy 中 , ...

最新文章

  1. 死锁产生条件-不剥夺条件
  2. python3 __repr__ __str__ 区别
  3. android studio 使用SVN 锁定文件,防止别人修改(基于Android studio 1.4 )
  4. 期望最大化(EM)算法真如用起来那么简单?
  5. GAN论文阅读路线图,更快地通过大量阅读入门GAN
  6. Android 系统(184)---Android APN 配置
  7. Java动态规划求最长公共子序列(LCS)
  8. 21日请假一天陪妈妈去国博
  9. 28. (附加)字符串的组合(C++版本)
  10. javascript 日期时间函数(经典+完善+实用)
  11. LTE:资源调度(5)
  12. python tkinter grid为什么不能用_Python Tkinter教程之Grid篇
  13. 图像几何运算——Matlab实现
  14. 名片微信小程序的代码,错误版本,待改正
  15. 长尾关键词是什么意思?如何使用5118挖掘和下载长尾词?
  16. 河南联通申请公网ip
  17. python高次方程求根公式,Python简单求解高阶方程的数值解
  18. STM32cubeide代码自动补全教程
  19. 中联医疗系统服务器,中联医学影像系统(PACS)
  20. 获取QQ音乐歌曲播放源地址

热门文章

  1. android commit apply,关于SharedPreference的commit和apply和ANR
  2. matlab把符号数,Matlab 符号与数值之间的转换
  3. Linux入门笔记——less
  4. pygame只能编写游戏_游戏框架搭建
  5. 《MySQL——备库多线程复制策略。》
  6. BBIAB的完整形式是什么?
  7. mca终端_MCA的完整形式是什么?
  8. 螺旋遍历_螺旋形式的水平阶遍历
  9. python安全攻防---信息收集---IP查询
  10. 容器宿主机数据库_解决Docker容器内访问宿主机MySQL数据库服务器的问题