技术开发 频道

C++开发者:Objective-C的历史和原理

  Objective-C的一些语法

  在Objective-C中语法的加法被设计为强调各种面向对象代码的语义。在C++中,你可以这样做:

  doSomething();这是调用一个C函数,调用一个静态的C++成员函数通过现前的对象传递作为一个隐含的参数,或者调用一个可以在子类中实现虚函数, 通过现

  前的对象作为一个隐含的参数。换一种方法,你也可以这样做:

  a.doSomething();这是调用一个C函数指针,它是一个结构体的域,调用一个定义在类上的静态成员函数其中你认为a是类的一个实例,或者一个定义在类上的虚方法其中a是一个真正实例。

  相反,在Objective-C中看起来象C其实就是C。在Objective-C中调用一个方法的等价源于Smalltalk语法:

  [a doSomething];方括号用来包装类Smalltalk信息发送语法。我将回过头来讲诉发送消息和调用函数的区别。当你有一个有很多参数的方法时,这些参数在Objective-C都有自己的名字,象这样:

  [aDictionary setObject:@”a string” forKey:@”a key”];对那些熟悉C语法的人这看起来非常奇怪,但它意味着你花很少时间去考虑参数的顺序。而且如果你先前不知道aDictionary是类的一个实例的话这也使代码易读—你知道这种方法传递一个对象和一个键,而且你只知道这些。

  在后台,这转化为下面这些:

  SEL sel = sel_get_uid(“setObject:forKey:”);

  IMP method = obj_msg_lookup(aDictionary->isa,sel);

  method(aDictionary, sel, @”a string”, @”a key”);

  我将回过头来讲诉sel是什么。当这起作用时,这并没有象发生的那样—当模块加载的时候通过运行时库的初始化填充sel的值。NeXT/Apple将后面两步合二为一如下:

  obj_msgSent(aDictionary, sel, @”a string”, @”a key”);速度稍微快些,但使实现优化类似不确定性内联变得稍微困难一些。因为这些是C函数,他们也不特殊——你可以在你自己的代码中调用他们。有一件有趣的事情,在LLVMC语言家族前后树是一个复写者,它包含Objective-C源文件并编译成C源文件以兼容在NeXT运行时库。

0
相关文章