2

我读过,objective-c 程序需要objective-c 运行时才能运行。

AFAIK,两个 C/C++ 程序都不需要运行任何运行时环境。因为生成的二进制代码是由底层操作系统直接执行的。

所以这意味着 Objective-c 程序需要一个冗余层来运行,对吗?如果是这样,这个层看起来像 Java VM 和 .net 运行时还是看起来像 Qt 运行时(有一些附加库的味道)?

EDIT: 经过一番阅读,我发现 objc 编译器在生成的编译代码中生成了更多信息,这些信息负责许多事情,例如方法传递(objc_sendMsg()introspection

谢谢。

4

1 回答 1

5

编译后的代码是原生的,但您需要一个额外的库(运行时)来完成所有对象和消息处理(查找、调用等)。不涉及虚拟机。所以它更像是 QT 而不是 Java 运行时。

[更新]

由于 C++ 消息绑定行为对于更动态的 OO 语言(例如:Objective-C 或 Smalltalk)的程序员来说并不明显 - 像我一样 - 我编写了一个小型 C++ 测试应用程序,它演示了virtual关键字对方法选择的影响称呼。

#include <iostream>

class Test1 {
public:
    Test1();
    void test1();
    void test2();
};

class Test2 : Test1 {
public:
    Test2();
    void test1();
    void test2();
};

Test1::Test1() {}
void Test1::test1() { std::cout << "T1:t1" << std::endl; }
void Test1::test2() { std::cout << "T1:t2" << std::endl; }

Test2::Test2() {}
void Test2::test1() { std::cout << "T2:t1" << std::endl; }
void Test2::test2() { std::cout << "T2:t2" << std::endl; }

int main(int argc, char **argv)
{
    Test1 *t11 = new Test1();
    Test1 *t12 = (Test1 *)(new Test2());
    Test2 *t2 = new Test2();

    t11->test1();
    t11->test2();

    t12->test1();
    t12->test2();

    t2->test1();
    t2->test2();

    return 0;
}

一个 Objective-C 程序员会期望输出

T1:t1
T1:t2
T2:t1
T2:t2
T2:t1
T2:t2

因为t12实际上是 a Test2which is cast to Test1。实际输出为

T1:t1
T1:t2
T1:t1
T2:t2
T2:t1
T2:t2

因为 C++(默认情况下,即没有)根据它在编译时知道的类型(由于virtual强制转换)静态地将调用绑定到。test1Test1

于 2011-09-09T12:27:08.290 回答