美文网首页
编译期和运行期

编译期和运行期

作者: 烟雨平生花飞舞 | 来源:发表于2018-06-08 17:09 被阅读0次

对于语句NSString *obj = [[NSData alloc] init]; obj在编译时和运行时分别是什么类型的对象?

编译时是NSString的类型;运行时是NSData类型的对象。

首先,声明 NSString *testObject 是告诉编译器,testObject是一个指向某个Objective-C对象的指针。因为不管指向的是什么类型的对象,一个指针所占的内存空间都是固定的,所以这里声明成任何类型的对象,最终生成的可执行代码都是没有区别的。这里限定了NSString只不过是告诉编译器,请把testObject当做一个NSString来检查,如果后面调用了非NSString的方法,会产生警告。

接着,你创建了一个NSData对象,然后把这个对象所在的内存地址保存在testObject里。那么运行时,testObject指向的内存空间就是一个NSData对象。你可以把testObject当做一个NSData对象来用。

编译时

编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字节码,C#中只有CLR能识别的MSIL.另外还有啥链接器.汇编器.为了了便于理解我们可以统称为编译器)

那编译时就是简单的作一些翻译工作,比如检查老兄你有没有粗心写错啥关键字了啊.有啥词法分析,语法分析之类的过程.就像个老师检查学生的作文中有没有错别字和病句一样.如果发现啥错误编译器就告诉你.如果你用微软的VS的话,点下build.那就开始编译,如果下面有errors或者warning信息,那都是编译器检查出来的.所谓这时的错误就叫编译时错误,这个过程中做的啥类型检查也就叫编译时类型检查,或静态类型检查(所谓静态嘛就是没把真把代码放内存中运行起来,而只是把代码当作文本来扫描下).所以有时一些人说编译时还分配内存啥的肯定是错误的说法.

运行时

所谓运行时就是代码跑起来了.被装载到内存中去了.(你的代码保存在磁盘上没装入内存之前是个死家伙.只有跑到内存中才变成活的).而运行时类型检查就与前面讲的编译时类型检查(或者静态类型检查)不一样.不是简单的扫描代码.而是在内存中做些操作,做些判断.

相关文章

  • 《Oracle Java SE编程指南》17-02:编译期类型与

    内容导航: 前言 1、编译期类型和运行期类型相同 2、编译期类型和运行期类型不同 1、编译期类型和运行期类型相同 ...

  • 深入Java虚拟机:多态性实现机制--动态单分派和静态多分派

    分派发生在编译期和运行期,编译期的分派为静态分派,运行期的为动态分派。编译期是根据对象声明的类型来选择方法,运行期...

  • Java 静态多分派&动态单分派

    分派发生在编译期和运行期,编译期的分派为静态分派,运行期的为动态分派。 编译期是根据对象声明的类型来选择方法,运行...

  • 编译期和运行期

    对于语句NSString *obj = [[NSData alloc] init]; obj在编译时和运行时分别是...

  • 十七:Java基础入门-Java的错误类型

    程序的错误分为编译期语法错误、运行期异常错误和运行期逻辑错误。 编译期语法错误可以借助IDE(集成开发环境,常见有...

  • 一 java体系的理解

    通常把java分为编译期和运行期, 但此处的编译和c语言的编译意义不同, javac的编译是将java源码编译为"...

  • java编译期和运行期

    何为运行期?何为编译期? 编译期是指编译器将源代码翻译为机器能识别的代码,java为编译为jvm认识的字节码文件。...

  • Java基础-String可以多长

    主要分编译期和运行期。1.编译期 这样定义的字符串在编译期就已经确定了,aaa字符串存放在方法区的常量池。代码编译...

  • JAVA之反射

    编译期和运行期的概念编译期:把源码交给编译器编译成计算机可以执行的文件的过程。即java代码编成class文件的过...

  • Java的反射机制和 OC 对比

    一 Java反射机制概述 我们都知道程序在运行的时候要经过编译期和运行期,编译期就是编译器吧源代码翻译成机器能识...

网友评论

      本文标题:编译期和运行期

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