Objective-c运行时是指比直接c/c ++程序更多的层吗?

Muh*_*edy 2 runtime objective-c objective-c-runtime

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

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

那么这意味着Objective-c程序需要一个冗余层来运行,正确吗?如果是这样,这个层看起来像Java VM和.net运行时还是看起来像Qt运行时(在一些额外的库中)?

EDIT: 一些读出后,我发现,在objc编译器生成在生成的编译代码一些更多的信息,其负责的许多东西,如方法通过(objc_sendMsg(),introspection及其他)

谢谢.

Til*_*ütz 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;
}
Run Code Online (Sandbox Code Playgroud)

Objective-C程序员期望输出

T1:t1
T1:t2
T2:t1
T2:t2
T2:t1
T2:t2
Run Code Online (Sandbox Code Playgroud)

因为t12实际上是一个Test2被铸造的Test1.实际输出是

T1:t1
T1:t2
T1:t1
T2:t2
T2:t1
T2:t2
Run Code Online (Sandbox Code Playgroud)

因为C++(默认情况下,即没有virtual)test1基于它在编译时知道的类型Test1(由于转换)静态地绑定调用.