A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yolande 中级黑马   /  2015-12-26 01:20  /  1410 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

运行:Objective-C runtime 运行 native code 。Java VM 运行 byte code。 

垃圾回收:Objective-C runtime 有过短暂的使用 conservative GC。但是 conservative GC 对于 native code,特别是经过优化的 native code 并不有效。所以目前 Objective-C 没有 GC(只有 ref-counting 的内存管理策略)。Java VM 有 generational GC。 

动态机制:Objective-C runtime 对 class method 的调用是通过全局名称查询。而 Java VM 是通过类似 C++ 的虚表机制。所以 Objective-C 无须 explicit interface 就能实现多态,能动态的给 class 添加方法,Java 则不行。这是很讽刺的,一个基于 byte code 的语言居然不如一个 native code 的语言动态。(Java 有 reflection 机制,但是这套机制是独立于 JVM 本身的静态调用机制的。Reflection 给予了你操作虚表的能力,但是基本的 JVM 仍然是通过虚表这个静态机制完成的。) 

对象:Objective-C 考虑到和 C 的交互,对象不能 relocatable。Java 的对象可以 relocate,因为没有 raw pointer 。

3 个回复

倒序浏览
自己顶一个先
回复 使用道具 举报
本帖最后由 gabriel2016 于 2015-12-26 16:09 编辑

NOTES
Objective-C runtime运行的指令集是native code
Java Virtual Machine运行的指令集是bytecode

Objective-C内存管理有ref-counting(引用计数机制)
Java内存管理有garbage collection(垃圾回收机制)

Objective-C runtime的调用机制是全局名称查询(能使用category给类动态地添加方法)
Java Virtual Machine的调用机制是虚表操作

Objective-C没有relocatable object
Java有relocatable object,Java没有raw pointer(原始指针,其实就是我们一般定义的那种指针),而是使用另一种数据类型——reference(引用)
回复 使用道具 举报
哈哈,好详细的!挺好的!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马