Objective-C语言的动态性

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/391069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内存泄漏和内存溢出的区别

原文地址https://www.zhihu.com/question/40560123 简单来说&#xff0c;操作系统就像资源分配人员&#xff0c;你要使用内存的时候分给你&#xff0c;你用完了还给它。如果你使用了没有分配给你的内存就是内存溢出&#xff0c;如果你用完了没有还就是内存泄漏。会引起的问题&a…

怎么注销笔记本icloud_如何在笔记本电脑或台式机的Web浏览器中在线查看Apple iCloud照片

怎么注销笔记本icloudPicture this: you just returned from a beautiful vacation and want to show all those gorgeous photos to your family. But your phone just died. And since youre at a family dinner your laptop is nowhere to be found.想象一下&#xff1a;您刚…

棒棒糖 宏_棒棒糖图表

棒棒糖 宏AKA: lollipop plot又名&#xff1a;棒棒糖情节 WHY: a lollipop chart (LC) is a handy variation of a bar chart where the bar is replaced with a line and a dot at the end. Just like bar graphs, lollipop plots are used to make comparisons between diff…

ubuntu上如何安装tomcat

1. 在官网下载linux里面的tomcat 2. 放到DownLoads下面--把tomcat的压缩包放到DownLoads3. sudo mkdir /usr/local/tomcat/ -在usr/local/路径下新建一个tomcat的文件夹4 sudo tar zxvf tomcat。。。。tar.gz -C /usr/local/tomcat/---把解压后的tomcat放到usr/local/下的tomca…

leetcode 1734. 解码异或后的排列(位运算)

给你一个整数数组 perm &#xff0c;它是前 n 个正整数的排列&#xff0c;且 n 是个 奇数 。 它被加密成另一个长度为 n - 1 的整数数组 encoded &#xff0c;满足 encoded[i] perm[i] XOR perm[i 1] 。比方说&#xff0c;如果 perm [1,3,2] &#xff0c;那么 encoded [2,…

ZooKeeper3.4.5-最基本API开发

2019独角兽企业重金招聘Python工程师标准>>> package cn.itcast.bigdata.zk;import java.io.IOException; import java.util.List;import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEven…

字符串转换整数python_将Python字符串转换为Int:如何在Python中将字符串转换为整数

字符串转换整数pythonUnlike many other programming languages out there, Python does not implicitly typecast integers (or floats) to strings when you concatenate them to strings.与现有的许多其他编程语言不同&#xff0c;Python在将整数连接到字符串时不会隐式地将…

理解Java里面的必检异常和非必检异常

问题&#xff1a;理解Java里面的必检异常和非必检异常 Joshua Bloch在"Effective Java"里面说过 在可恢复的条件下和编程错误导致的运行时错误时&#xff0c;使用必检异常&#xff08;第二版的第52页&#xff09; 让我们来看一下我对这个的正确理解吧 下面是我对…

使用vim打开文件的16进制形式,编辑和全文替换

1、先用vim打开文件的二进制形式&#xff0c;如果不以二进制可能会产生转换错误。 vim -b file-to-open.dat 2、用xxd把文件转换成十六进制格式 :%!xxd 现在就可以对待普通文本一样查看和编辑二进制文件了。 3、vim 单文件替换方法 :%s/old/new/gc 全文执行替换,询问是…

nlp自然语言处理_不要被NLP Research淹没

nlp自然语言处理自然语言处理 (Natural Language Processing) 到底是怎么回事&#xff1f; (What is going on?) NLP is the new Computer VisionNLP是新的计算机视觉 With enormous amount go textual datasets available; giants like Google, Microsoft, Facebook etc have…

opencv 随笔

装环境好累&#xff0c;python3.6&#xff0c;opencv3.4 好不容易装好了&#xff0c;结果 addweight的时候总是报错 The operation is neither array op array (where arrays have the same size and the same number of channels), nor array op scalar, nor scalar op array …

js打开飞行模式_什么是飞行模式? 它有什么作用?什么时候应该打开它?

js打开飞行模式If youve flown on an airplane in the last decade and you have a smart phone, youve likely had to put that phone in airplane mode before the plane takes off.如果您在过去的十年中乘坐过飞机&#xff0c;并且拥有一部智能手机&#xff0c;那么您可能必…

在Java 里面怎么比较字符串

问题&#xff1a;在Java 里面怎么比较字符串 到目前为止&#xff0c;我使用 操作符去比较字符串在我的程序里面。然而&#xff0c;却产生了一个bug&#xff0c;将这个改为了.equals()以后&#xff0c;就把bug修复了 是不是太辣鸡了&#xff1f;它什么时候应该被使用或者说是不…

中小型研发团队架构实践三要点(转自原携程架构师张辉清)

如果你正好处在中小型研发团队…… 中小型研发团队很多&#xff0c;而社区在中小型研发团队架构实践方面的探讨却很少。中小型研发团队特别是 50 至 200 人的研发团队&#xff0c;在早期的业务探索阶段&#xff0c;更多关注业务逻辑&#xff0c;快速迭代以验证商业模式&#xf…

时间序列预测 预测时间段_应用时间序列预测:美国住宅

时间序列预测 预测时间段1.简介 (1. Introduction) During these COVID19 months housing sector is rebounding rapidly after a downtime since the early months of the year. New residential house construction was down to about 1 million in April. As of July 1.5 mi…

zabbix之web监控

Web monitoring(web监控)是用来监控Web程序的&#xff0c;可以监控到Web程序的下载速度&#xff0c;返回码以及响应时间&#xff0c;还支持把一组连续的Web动作作为一个整体进行监控。 1.Web监控的原理 Web监控即对HTTP服务的监控&#xff0c;模拟用户去访问网站&#xff0c;对…

如何使用Webpack在HTML,CSS和JavaScript之间共享变量

Earlier this week, I read an article explaining how CSS-in-JS slows down the rendering of some React apps and how static CSS is faster. But CSS-in-JS is very popular because, among other features, you can style dynamically using JavaScript variables.本周初…

Java中获得了方法名称的字符串,怎么样调用该方法

问题&#xff1a; Java中获得了方法名称的字符串&#xff0c;怎么样调用该方法 如果我有以下两个变量 Object obj; String methodName "getName";在不知道obj的类的情况下&#xff0c;我怎么样才能调用该类的名叫methodName的方法呢&#xff1f; 这个方法被调用时…

经验主义 保守主义_为什么我们需要行动主义-始终如此。

经验主义 保守主义It’s been almost three months since George Floyd was murdered and the mass protests. Three months since the nationwide protests, looting and riots across America.距离乔治弗洛伊德(George Floyd)被谋杀和大规模抗议活动已经快三个月了。 全国抗议…

Begin

Hello everyone, Finally,a technician from feiyang help me solve the question. Even though it is not the linux version i want.emmm...linux mint a new one i dont know about it And, lets make the life regular and delicate转载于:https://www.cnblogs.com/lxc-run…