【问题标题】:What is "->" in Objective C?Objective C 中的“->”是什么?
【发布时间】:2011-05-28 00:40:53
【问题描述】:

我已经在“在 Mac 上学习 Objective C”的示例代码中多次看到此运算符弹出。

我相信它是Objective C继承的C语言中的运算符。 我尝试用谷歌搜索 Stack Overflow,但奇怪的是什么都没找到。

有英文名字吗?

【问题讨论】:

    标签: objective-c c pointers


    【解决方案1】:

    它与结构有关。

    当我们在堆栈上本地有一个可用的结构时,我们使用. 运算符访问它的成员。例如:

    CGPoint p = CGPointMake(42,42);
    NSLog(@"%f", p.x);
    

    但是,如果我们有一个指向结构的指针,我们必须使用-> 运算符:

    CGPoint *p = malloc(1*sizeof(CGPoint));
    p->x = 42.0f;
    NSLog(@"%f", p->x);
    free(p);
    

    【讨论】:

    • 我们不必,我们可以使用(*p).x 代替。
    • @jer 当然,但我认为p->x(*p).x 更易于阅读。
    【解决方案2】:

    -> 不是特定于 Objective-C。这是一个 C 运算符。

    现在清除了,就是成员访问操作符,相当于一个指针解引用,然后在结果上使用点操作符。

    假设你有一个这样的struct

    typedef struct Person {
       char *name;
    } Person;
    
    Person *jacob = malloc(1*sizeof(Person));
    

    所以这句话:

    jacob->name = "Jacob";
    

    相当于这个语句:

    (*jacob).name = "Jacob";
    

    当然,别忘了free

    free(jacob); 
    

    【讨论】:

    • 当你说它等同于*时,其实不是。相当于取消引用然后使用 . 访问
    • @Mitch,不,我真的是这个意思。
    • 可能创建一个 Person 结构然后分配,以确保完全正确。
    【解决方案3】:

    在 C 中

    a->b
    

    是一个快捷方式

    (*a).b
    

    用于解引用指向的结构的成员。

    这很有用,因为 .绑定比取消引用运算符 * 更强。所以通过使用 -> 可以避免使用这些丑陋的括号。

    【讨论】:

      【解决方案4】:

      这是一个成员选择(或访问)等价于指针取消引用(如 cmets 中所指出的)

      a->member 等价于 C/C++ 中的(*a).member

      【讨论】:

      • 作为上述推论,它与 C 中的内容相同。
      • 我认为不赞成是因为您说它是指针解引用,而实际上指针解引用运算符是通常的*; C99 标准将其称为“成员访问运算符”作为点 (.) (§6.6.9)。我只想说这是(*a).Member 符号的简写。
      • (将Property改为member,因为Property在Objective-C中有不同的含义)
      【解决方案5】:

      The same thing that it means in C。它可用于直接访问对象的实例变量,但通常这不是最佳做法。您所指的点表示法是property,而不是通常的 C 点表示法。

      【讨论】:

      • 有趣的是self->bla(或普通bla)直接访问ivar,而self.bla通过属性访问器访问它。
      • 是的,这在我的回答中有所暗示。特别是,您不能使用self.bla 访问实例变量,因为self 是指向内存中对象的指针。这就是为什么你必须使用->。这就是为什么 C 点表示法和 Obj-C 属性之间没有冲突的原因:)
      【解决方案6】:

      它是“间接成员访问运算符”。它是一个 C 运算符,Objective-C 和 C++ 都继承了它。

      这个

      a->b
      

      相当于:

      (*a).b
      

      但打字较少。 (由于*. 的优先级,扩展形式中的括号是必需的。)

      【讨论】:

        【解决方案7】:

        a->b 等价于(*a).b,并指定a 指向的对象的成员b

        在 C 标准中,它被称为“结构/联合指针运算符”,这并不是最吸引人的名字。

        【讨论】:

          【解决方案8】:

          都说了,它是访问结构指针成员的快捷方式,但只是要补充一点,由于 Objective-C 运行时的工作方式,您可以使用相同的语法访问 ivars:

          @interface Foo : NSObject {
             NSString *something;
          }
          
          /* ... SNIP ... */
          
          NSLog(@"something = %@", foo->something); // Where foo is an instance of the Foo class
          

          当您需要访问未通过方法公开的 ivars 时,这很方便;特别是当您需要在对象上实现 copyWithZone: 时。

          【讨论】:

          • 没关系,但你能告诉我这是什么意思吗? loginViewController->mPortSIPSDK = mPortSIPSDK;第一个 mportSIPSDK 是在 loginviewcontroller 中声明的 PORTSIPSDK 实例。第二个是在 aoodelegate 中声明的 ie(=mPortSIPSDK)。
          猜你喜欢
          • 2010-11-15
          • 2012-03-18
          • 1970-01-01
          • 1970-01-01
          • 2010-12-07
          • 2011-03-23
          • 2014-01-17
          • 2011-03-06
          • 2012-11-16
          相关资源
          最近更新 更多