【问题标题】:How does calling a method in Objective-C differ from C++? [duplicate]在 Objective-C 中调用方法与 C++ 有何不同? [复制]
【发布时间】:2011-12-20 09:51:03
【问题描述】:

可能重复:
Objective C message dispatch mechanism

我的问题不是关于语法的。我想了解在 C++ 中调用方法与在 Objective-C 中向对象发送消息有何不同以及它们是如何执行的?

【问题讨论】:

标签: c++ objective-c gcc


【解决方案1】:

这是一个相当复杂的问题,因为与 C 不同,没有固定的 C++ 调用对流。

Objective-C 只是 C 的一个薄包装,所以它使用相同的约定。 到现在还有一件事,当您发送如下消息时:

[target selector];

同理:

objc_msgSend(target, @selector(selector));

然后它只是传统的 C 调用约定,首先查找与您的消息匹配的函数。 objc_msgSend 有点复杂,因为它将参数堆栈保持在原位并将其直接传递给底层函数。

C++ 调用约定因名称修改不同而不同,甚至不同编译器不同。

从性能的角度来看,C++ 方法调用更快,因为链接是在编译时解析的(更准确地说是在链接时)。该方法存在或不存在,导致链接器错误。

Objective-C 方法调用包括在运行时查找方法表,因此您的方法可以稍后添加到您的代码中,这提供了更大的灵活性但性能较低。

【讨论】:

  • 这也是为什么Obj-C方法中的“this”关键字实际上是方法的隐藏参数的原因吗?
  • objc_msgSend 是一个函数而不是一个方法,据我所知,这个关键字在 Obj-C 中根本不存在,因为 self 做同样的工作。它允许使用具有实用程序的 Obj-C++。
  • 哦,是的,我的意思是说自己不是这个。太习惯 C# 和 C++ 约定了!
  • 那么是的,它是一个隐藏参数,但对于 C++ 可能是相同的(再次取决于编译器),因为无论对象使用它,方法定义都保持相同。所以 self 或 this 变量是或分别可以作为参数传递。使用这种方法,你也可以在 C 中做一些(某种)OOP,即使这不是真的有用:)
【解决方案2】:

完全一样又完全不同。在 C++ 中你会说

result = myObjectPtr ->myMethod(myParm1, myParm2);

在 Objective-C 中你会说

result = [myObjectPtr myMethodWithParm1:myParm1 andParm2:myParm2];

在简单的情况下,从外观的角度来看,它们的功能相同,但在实现级别上有很多差异,因为 Objective-C 调用是动态的。

要详细列举所有差异需要几页纸(尽管对于最简单的情况,差异并不显着)。

【讨论】:

  • “我的问题不在于语法。”
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
相关资源
最近更新 更多