【问题标题】:What does `->` symbol represent in objective-c [duplicate]`->`符号在objective-c中代表什么[重复]
【发布时间】:2013-02-19 15:20:04
【问题描述】:

我一直在查看一些代码,发现符号 -> 被用作 obj->method(argument); 我做了一些研究,发现它与 [obj method:argument]; 基本相同,但我不确定 @987654324 是什么@ 实际上是或确实是。

所以我的问题是,-> 符号在 Objective-c 中是什么意思?

【问题讨论】:

  • @JordiKroon 我倾向于不同意这些是重复的。这是在问 -> 符号是什么意思,而这个问题是在问“。”之间的区别。和“->”
  • 它在 C 中所代表的东西是一样的,在深入研究 Objective-C 之前你应该学习它。
  • @HotLicks 我开发了大量应用程序商店中的应用程序,我不必了解这是什么。我问的唯一原因是因为 3 年来我第一次看到它被用于一些开源代码。所以我不会说在深入 Objective-c 之前需要学习它
  • @JoshCaswell 可能是为什么有人投反对票的粗鲁方式?

标签: objective-c


【解决方案1】:

它的含义与 C 中的 struct 取消引用运算符相同,用于通过指针访问 struct 中的字段:

struct mystruct
{
    int field;
};

struct mystruct *mystruct = ...;
printf("field=%d\n", mystruct->field);

在 Objective-C 中,它也可以用于访问 Objective-C 对象中的字段:

@interface MyObj : NSObject
{
@public
    int field;
}
@end

MyObj *myObj = [[MyObj alloc] init];
NSLog(@"field=%d", myObj->field);

请注意,只有声明为 @public 的这些字段才能在外部访问。

【讨论】:

  • +1。请注意,第二种用法并不常见(我从未在实际的运输代码中亲自使用过它),而且它实际上也与第一种用法完全相同。 Objective-C 对象在内部实现为结构体,因此指向对象的指针实际上是指向结构体的指针。
  • 无论如何都是结构;直到现代运行时,它们都是直接的结构。现在有一点魔法可以解决脆弱的基类问题(它允许将 ivars 添加到基类而不需要重新编译子类)。
  • @bbum 和安德鲁;您可以向我澄清的一件事是 OP 声称能够通过-> 调用方法,但是在这种情况下self 是如何传递给方法的;编译器是否只是将其视为 Objective-C 调用?
  • 是的——不 :)——他不能通过那种语法调用方法。
  • 无法调用 Objective-C 方法。可以在 Objective-C++ 模块中调用 C++ 方法。
【解决方案2】:

我一直在查看一些代码并遇到了符号 -> 是 像 obj->method(argument) 一样使用;我做了一些研究 发现和[obj method:argument]基本一样;但我是 不确定 -> 实际上是什么或做什么。

所以我的问题是,objective-c 中的 -> 符号是什么意思?

与 C 中的含义完全相同;它用于访问 C 结构中的项目。回到过去,Objective-C 纯粹是作为 C 预处理器扩展 + 运行时实现的。类只不过是串联的 C 结构,预处理器将每个 ivar 访问转换为 self->ivar

ivarself->ivar 做同样的事情(在类的方法中)。

现在,您可以使用-> 戳其他对象的 (@public) ivars。但是不要。这完全破坏了封装,因为 Objective-C 的封装线是在方法接口处绘制的。始终使用 setter/getter,以便可以观察或覆盖行为。

最后,不,再也没有像obj->method(argument) 这样的东西了。曾经有一个名为现代语法的失败实验,但它被放弃了,因为它毫无意义地浪费时间。您不能使用-> 来调用方法。

【讨论】:

  • "你不能使用 -> 来调用方法。"在 Objective-C++ 中呢?
  • 您可以使用它来调用 C++ 方法,但不能调用 Objective-C 方法。
  • +1 这是非常有用的信息,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 2014-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-11
相关资源
最近更新 更多