“->”是什么意思?

7

我对Objective-C相对陌生(只看过Arron Hillegras的书),在苹果公司的一个代码示例中发现了以下代码片段,特别是->代表什么我感到困惑?

-(id) initWithNumbers:(NSArray *)numbers
{
    self = [super init];
    if (self != nil)
    { 
       self->_numbers = [numbers copy];
    }
    return self;
}

在头文件中,_numbers被声明为:
NSNumber * _number;

(下划线在某些情况下具有重要意义,但我记得在某个地方读过这个知识点,但现在我无法回忆起来了。

谢谢, 罗宾

5个回答

8

->是一个用于访问指向结构体的指针成员的普通C运算符;而.运算符则用于访问结构体成员。因此:

a->b

被翻译为

(*a).b

由于Objective-C对象在底层是指向结构体的指针,因此这种方式可以访问实例变量。


2

当您想要访问实例变量时,可以使用->。与C结构体类似,您可以在Objective-C对象中使用.->(指向结构体的指针),但是由于可以直接访问它们,因此不需要使用->

因此:

self->_numbers = [numbers copy];

并且

_numbers = [numbers copy];

是相同的

当您想要显式访问那个实例变量时,您需要使用->

请注意,在Objective-C中,只有在它是属性时才能使用.。但是,无论如何都可以使用->


2
通常称为“箭头”运算符。它允许您使用对实例的引用或指针来访问对象(或struct)的实例变量。这是C和C ++的常见语法。
我很难找到一个好的写作,但你可能会发现这篇文章很有启发性:this one
至于下划线 - 通常它们意味着“私有”; 根据Cocoa编码指南 - 命名基础知识
避免使用下划线字符作为前缀,表示私有,特别是在方法中。苹果公司保留了这种惯例。第三方的使用可能会导致命名空间冲突;他们可能会不知情地覆盖现有的私有方法,造成灾难性后果。

非常感谢 - 这些链接很有帮助,我想我现在已经理解了这个概念。 - ManorBoy

0

这表示对对象的一个实例变量的引用。在这种情况下,self指的是对象本身,通过编写self->_numbers,您引用的是类中的变量,而不是全局变量_numbers

你确定你的书里没有提到吗?


是的,可能是这样,但我找不到它。索引也没有帮助(:-) - ManorBoy

0

这是一个源自C编程语言的运算符。由于Objective-C与C编程兼容,因此您可能会看到开发人员使用传统的C风格编程。

"->"用于访问指针的元素。由于Objective-C中的“对象”只是指针(以*表示),例如NSNumber *number; ,您可以使用此表示法来访问它们的元素。

我在Objective-C中从未使用过此符号,因为Objective-C中的点表示法被接受。如果“self”具有合成属性“number”,则self.number应与self->number相同(这仅适用于Objective-C)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接