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及其他)
谢谢.
已编译的代码是本机代码,但您需要一个额外的库(运行时)来执行所有对象和消息处理(查找,调用等).没有涉及虚拟机.所以它更像是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(由于转换)静态地绑定调用.
| 归档时间: |
|
| 查看次数: |
491 次 |
| 最近记录: |